C++ string中的find()函数

重中之重:find查询失败会返回一个特殊值,不是0,也不是末尾:str.size()-1。它是npos,在各个电脑上并不相同。通过string::npos来使用它

while(idx<=k.size()-s.size() && k.find(s,idx)!=string::npos ) {
     
		cnt ++;//字串出现在k中多少次?
		idx = k.find(s,idx)+1;
	}

1.string中find()返回值是字母在母串中的位置(下标记录),如果没有找到,那么会返回一个特别的标记npos。(返回值可以看成是一个int型的数)

 1 #include
 2 #include
 3 #include
 4 using namespace std;
 5 int main()
 6 {
 7     ////find函数返回类型 size_type
 8     string s("1a2b3c4d5e6f7jkg8h9i1a2b3c4d5e6f7g8ha9i");
 9     string flag;
10     string::size_type position;
11     //find 函数 返回jk 在s 中的下标位置
12     position = s.find("jk");
13     if (position != s.npos)  //如果没找到,返回一个特别的标志c++中用npos表示,我这里npos取值是4294967295,
14     {
15         printf("position is : %d\n" ,position);
16     }
17     else
18     {
19         printf("Not found the flag\n");
20     }
21 }

 

2.返回子串出现在母串中的首次出现的位置,和最后一次出现的位置。

1  flag = "c";
2      position = s.find_first_of(flag);
3      printf("s.find_first_of(flag) is :%d\n",position);
4      position = s.find_last_of(flag);
5      printf("s.find_last_of(flag) is :%d\n",position);

 

 

3.查找某一给定位置后的子串的位置

1  //从字符串s 下标5开始,查找字符串b ,返回b 在s 中的下标
2     position=s.find("b",5);
3     cout<<"s.find(b,5) is : "< 
  

 

4.查找所有子串在母串中出现的位置

//查找s 中flag 出现的所有位置。
    flag="a";
    position=0;
    int i=1;
    while((position=s.find(flag,position))!=string::npos)
    {
        cout<<"position  "< 
  

 

5.反向查找子串在母串中出现的位置,通常我们可以这样来使用,当正向查找与反向查找得到的位置不相同说明子串不唯一。

1     //反向查找,flag 在s 中最后出现的位置
2     flag="3";
3     position=s.rfind (flag);
4     printf("s.rfind (flag) :%d\n",position);

 

 

例题:

1.给出一个字符串,串中会出现有人名,找到一个只有一个人名的字符串。

 1 #include 
 2 using namespace std;
 3 vector s;
 4 int main()
 5 {
 6     s.push_back("Danil");
 7     s.push_back("Olya");
 8     s.push_back("Slava");
 9     s.push_back("Ann");
10     s.push_back("Nikita");///建立动态数组
11     string a;
12     cin>>a;
13     int res = 0;
14     for(int i = 0; i < 5; i++)
15     {
16         if(a.find(s[i]) != a.npos)
17         {
18             res++;
19             if(a.rfind(s[i]) != a.find(s[i]))///一个字符中出现多个一样的名字
20             {
21                 res++;
22             }
23         }
24     }
25     if(res == 1) 
26     {
27         cout<<"YES"< 
  

 

 

2.你有n个字符串。 每个字符串由小写英文字母组成。 重新排序给定的字符串,使得对于每个字符串,在它之前的所有字符串都是它的子串。

https://www.cnblogs.com/wkfvawl/p/9229758.html

 1 #include
 2 #include
 3 #include
 4 #include
 5 using namespace std;
 6 bool cmp(string a, string b)
 7 {
 8     if (a.length() == b.length())
 9         return a < b;
10     return a.length() < b.length();
11 }
12 int main()
13 {
14     int n;
15     string s[111];
16     scanf("%d", &n);
17     for (int i = 0; i < n; i++)
18     {
19         cin >> s[i];
20     }
21     sort(s, s + n, cmp);
22     int flag = 1;
23     for (int i = 1; i < n; i++)
24     {
25         if (s[i].find(s[i-1]) == string::npos)
26         {
27             flag = 0;
28             break;
29         }
30     }
31     if (flag)
32     {
33         cout << "YES" << endl;
34         for (int i = 0; i < n; i++)
35         {
36             cout << s[i] << endl;
37         }
38     }
39     else
40     {
41         cout << "NO" << endl;
42     }
43     return 0;
44 }

 

 3.查询区间内子串在母串中的个数。

https://www.cnblogs.com/wkfvawl/p/9452869.html

 

 1 #include
 2 #include
 3 #include
 4 #include
 5 #include
 6 using namespace std;
 7 int main()
 8 {
 9     int n,m,q,i,j,l,r,len;
10     int counts;
11     int vis[10010];
12     string s1,s2;
13     cin>>n>>m>>q;
14     cin>>s1>>s2;
15     len=s2.size();
16     memset(vis,0,sizeof(vis));
17     string::size_type pos=0;
18     while((pos=s1.find(s2,pos))!=string::npos)
19     {
20         vis[pos+1]=pos+1;
21         pos++;
22     }
23     for(i=1;i<=q;i++)
24     {
25         counts=0;
26         scanf("%d%d",&l,&r);
27         for(j=l;j<=r;j++)
28         {
29             if(vis[j]!=0&&vis[j]+len-1<=r)
30             {
31                counts++;
32             }
33         }
34         printf("%d\n",counts);
35     }
36     return 0;
37 }

 

你可能感兴趣的:(程序设计与算法,随笔)