天天看点

信息学奥赛一本通 1140:验证子串 | OpenJudge NOI 1.7 18

【题目链接】

ybt 1140:验证子串

OpenJudge NOI 1.7 18:验证子串

【题目考点】

1. 字符串处理

2. string类取子串函数

substr(起始位置, 子串长度)

【思路及题解代码】

解法1:用字符数组

  1. 首先比较两个字符串的长短,若s1的长度大于等于s2的长度,则不操作。如果s1的长度小于s2的长度,那么将s1与s2的值交换。保持s1的长度大于等于s2的长度。此时只需检测s2是否是s1的子串。
  2. 遍历s1,设变量j,j表示现在看s2的哪一个字符。不断比较s1[i]与s2[j],若二者相同,j增加1,比较后一个字符。若二者不同,j归0。若j的值已经增加至s2的长度,说明s1中存在完整的s2的字符串,那么s2是s1的子串。
#include<bits/stdc++.h>
using namespace std;
 int main()
{
    char s1[205], s2[205], temp[205];
    cin>>s1>>s2;
	int len1 = strlen(s1), len2 = strlen(s2), t;
    if(len1 < len2)
    {
    	strcpy(temp, s1);
		strcpy(s1, s2);
		strcpy(s2, temp);
		t = len1;
		len1 = len2;
		len2 = t;
	}//保持s1的长度大于等于s2的长度 
	int j = 0;
	for(int i = 0; i < len1; ++i)
	{
		if(s1[i] == s2[j])
		{
			j++;
			if(j == len2)//j已经指向s2的'\0',那么s2是子串 
			{
				 cout<<s2<<" is substring of "<<s1;
				 return 0;				
			}
		}
		else
			j = 0;
	}
	cout<<"No substring";
	return 0;
}
           

解法2:用string类,substr函数

  1. 首先比较两个字符串的长短,若s1的长度大于等于s2的长度,则不操作。如果s1的长度小于s2的长度,那么将s1与s2的值交换。保持s1的长度大于等于s2的长度。此时只需检测s2是否是s1的子串。
  2. 遍历s1,从每个位置开始,截取长度为s2的长度的子串,看该字符串和s2字符串是否完全相同。string类对象可以直接用=判断相同。
#include<bits/stdc++.h>
using namespace std;
int main()
{
    string s1, s2, st;
    cin>>s1>>s2;
    if(s1.length() < s2.length())
    {
        st = s1;
        s1 = s2;
        s2 = st;
    }//使s2比s1短
    for(int i = 0; i <= s1.length() - s2.length(); ++i)
    {
        if(s1.substr(i, s2.length()) == s2)
        {
            cout<<s2<<" is substring of "<<s1;
            return 0;
        }
    }
    cout<<"No substring";
    return 0;
}
           

继续阅读