变换循环变量,降低复杂度
2018-02-10 07:57
218 查看
在一些问题中,如果适当选择循环变量,将会降低程序的复杂度,例如判断子串的问题:
判断字符串 s 是不是 t的子串,有两种方案
方案一
思路:对s中的元素遍历,根据贪心的思想,搜索t中第一个该元素,若不存在,则说明s不是t的子串。注意,s中的元素在t中的相对位置必须保持不变,所以每一次搜索时,应该从上一次搜索到的位置处搜索。
实现:搜索可以用 cstring 中的strchr函数。
复杂度应该是O(n2)O(n2)
方案二
思路:对t中元素遍历,并与s中当前待比较元素比较。
实现:用ii代表s中当前待比较元素的下标。
复杂度是O(n)O(n);
判断字符串 s 是不是 t的子串,有两种方案
方案一
思路:对s中的元素遍历,根据贪心的思想,搜索t中第一个该元素,若不存在,则说明s不是t的子串。注意,s中的元素在t中的相对位置必须保持不变,所以每一次搜索时,应该从上一次搜索到的位置处搜索。
实现:搜索可以用 cstring 中的strchr函数。
复杂度应该是O(n2)O(n2)
int is_sub(char *s,char *t){ int len=strlen(s); char *p=t; for b22e (int i=0;i<len;++i){ char *q=strchr(p,s[i]); if(q==NULL) { return 0; } else{ q[0]=' '; p=q; } } return 1; }
方案二
思路:对t中元素遍历,并与s中当前待比较元素比较。
实现:用ii代表s中当前待比较元素的下标。
复杂度是O(n)O(n);
int is_sub(char *s,char *t){ int lent=strlen(t),lens=strlen(s); int i=0; for(int j=0;j<lent;++j){ if(t[j]==s[i]) ++i; if(i==lens) return 1; } return 0; }
相关文章推荐
- 不能用循环和本地变量,对一个整形n,实现输出n,2n,4n,...当大于max(比如5000)时再逆向输出...4n,2n,n
- 探索MATLAB循环语句内部的变量
- 循环中冲不掉外部定义的变量
- 循环中的变量为什么不能定义为浮点型
- 【Javascript】: for循环中定义的变量在for循环体外也有效
- go template 循环中使用 外部变量
- javaSE第一部分_基本变量_操作符_循环
- 循环体外和循环体内定义变量的一点思考
- Shell基础- 变量、判断、循环
- hdu 5185 动态规划 分析降低复杂度
- 使用 let 解决for 循环闭包 i变量问题
- freemarker中变量范围,assign,以及用.globals,已经循环变量的讨论
- Perl中foreach循环变量
- bash 循环中变量作用范围的问题分析
- ACM算法-时间复杂度分析(4.有关时间复杂度循环的分析)
- 如何利用一个变量来达到多重循环的效果?
- js动态循环绑定事件的变量问题
- 遍历json对象的属性和值,并循环动态定义声明变量
- Stack(5)对栈排序不用循环空间复杂度O(1)
- freemark list 循环变量类型错误问题