最小表示法 字符串循环同构问题
2015-01-26 19:21
274 查看
用最小表示法返回最小表示串(字典序最小的同构串)第一个字符在原始串中的下标。
用两个指针i,j,i初始化为0,j初始化为1,用k表示当前已经匹配串的长度。如果str[i+k]==str[j+k],j++,否则如果str[i+k]>str[j+k],说明以i开始的同构串肯定不是最小的,并且以i开始的到以i+k开始的都不会是最小的,因为若以i+x开头,0<=x<=k,那么这时以j+x开头的串比这个串小,因为前面相等,比较到i+k和j+k发现str[j+k]小,因此就把i移到i+k+1。同理如果str[i+k]>str[j+k],把j移到j+k+1,如果i==j,j++。直到i,j,k中有一个大于等于串的长度为止。最后返回i和j里较小的那个。
用两个指针i,j,i初始化为0,j初始化为1,用k表示当前已经匹配串的长度。如果str[i+k]==str[j+k],j++,否则如果str[i+k]>str[j+k],说明以i开始的同构串肯定不是最小的,并且以i开始的到以i+k开始的都不会是最小的,因为若以i+x开头,0<=x<=k,那么这时以j+x开头的串比这个串小,因为前面相等,比较到i+k和j+k发现str[j+k]小,因此就把i移到i+k+1。同理如果str[i+k]>str[j+k],把j移到j+k+1,如果i==j,j++。直到i,j,k中有一个大于等于串的长度为止。最后返回i和j里较小的那个。
int min_express(char* str){ int len=strlen(str),i=0,j=1,k=0; while(i<len&&j<len&&k<len){ int t=str[(j+k)%len]-str[(i+k)%len]; if(!t) k++; else{ if(t<0) i=i+k+1; else j=j+k+1; if(j==i) j++; k=0; } } return min(i,j); }
相关文章推荐
- [转]浅析“最小表示法”思想在字符串循环同构问题中的应用-HDU2609
- 字符串循环同构的最小表示法(转)
- 【理解字符串循环同构的最小表示法】
- Vijos 有根树的同构问题【字符串---最小表示法】
- 【理解字符串循环同构的最小表示法】
- 【字符串】【最小表示法】Vijos P1683 有根树的同构问题
- 理解字符串循环同构的最小/最大表示法+模板
- 【理解字符串循环同构的最小表示法】
- 【理解字符串循环同构的最小表示法】
- 理解字符串循环同构的最小表示法
- 字符串循环同构——最小表示法の板子
- 理解字符串循环同构的最小表示法
- 【字符串】【最小表示法】Vijos P1683 有根树的同构问题
- 【字符串循环同构的最小表示法】
- 字符串循环同构的最小表示法(转)
- 隐藏密码(字符串的同构与最小表示法)
- 【判段同构】字符串最小表示法
- HDU 2609 How many(字符串同构,最小表示法)
- 字符串同构的最小表示方法
- BZOJ 2882 工艺 (字符串最小循环同构)