题目1555:重复子串 string.find() , string::npos

题目1555:重复子串

给定一个由小写字母组成的字符串,求它的所有连续子串中,出现过至少两次,且至少有一对出现的重复子串是不重合的连续子串个数。
如给定字符串aaaa,aa和a,符合条件,aaa不符合条件(出现重合),故答案为2。

输入:

输入包含多组测试用例,每组测试用例包含一个字符串,由小写字母组成,其长度不大于1000。

输出:

对于每组测试数据,输出一个整数,代表符合条件的子串个数。

样例输入:
aaaa
aaa
样例输出:
2
1
这个题思想比较简单。

string . substr(id , Len)   . 截取  【id  , id+Len) 的字符串

从string   before =  【id  , id+len)   

                 next     =   [ id+len , string.size) 

如果next中包含before  ,则 before满足  ,反之以id开头的字符串都不满足。

const int Max_N = 1008 ;
char str[Max_N] ;
set <string> ans ;

int Ans(){
    string s = string(str) ;
    string before , next ;
    int start , len  ;
    int L = s.length()  ;
    ans.clear() ;
    for(start = 0 ; start < L ; start++){
        for(len = 1 ; len + len + start <= L ; len++){
            before = s.substr(start , len) ;
            next   = s.substr(start+len , L-start-len) ;
            if(next.find(before) != string::npos)
                ans.insert(before) ;
            else
                break ;
        }
    }
    return ans.size() ;
}

int main(){
    while(scanf("%s" ,str) != EOF){
        printf("%d\n" , Ans()) ;
    }
    return 0 ;
}





下面是MSDN中的说明

basic_string::npos
static const size_type npos = -1;
The constant is the largest representable value of type size_type. It is assuredly larger than max_size(); hence it serves as either a very large value or as a special code.
npos表示string的结束位置,是string::type_size 类型的,也就是find()返回的类型。
 要想判断 find() 的结果是否为npos,最好的办法是直接比较: if (str.find("abc") ==string::npos) {... } 
 要想判断 find() 的结果是否为npos,最好的办法是直接比较: if (str.find("abc") ==string::npos) {... } 


string::size_type (由字符串配置器allocator 定义) 描述的是 size,故需为无符号整数

 要想判断 find() 的结果是否为npos,最好的办法是直接比较: if (str.find("abc") ==string::npos) {... } 


你可能感兴趣的:(题目1555:重复子串 string.find() , string::npos)