题目描述:
思路解析:
如果s长度小于t的长度,直接打印0
将s串拆分为与t串长度相等的串,如ababcb拆分为aba,bab,abc,bcb,将拆分的串与t作比较,是否相似
比较两串是否相似,如,比较aba与xyx,用数字代替字符,相同字符用相同的数字代替,aba变为121,xyx变为121,二者相同,说明相似。
abc变为123,xyx为121,所以二者不相等
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int solve(string t1, string t)
{
vector<int>vt1;
vector<int>vt;
int it1=1;
int it = 1;
int len = t.length();
vt1.push_back(it1);
for (int i = 1; i < len; i++)
{
for (int j = 0; j < i; j++) //比较该位上的字符与前面的是否重复
{
if (t1[i] == t1[j])
{
vt1.push_back(vt1[j]); //有重复,填入前面出现的数字
break;
}
}
if (vt1.size()<i+1) //没有重复,填入新的数字
vt1.push_back(++it1);
}
vt.push_back(it);
for (int i = 1; i < len; i++)
{
for (int j = 0; j < i; j++)
{
if (t[i] == t[j])
{
vt.push_back(vt[j]);
break;
}
}
if (vt.size()<i + 1)
vt.push_back(++it);
}
for (int m = 0; m < len; m++) //比较转化的数字序列是否相等,有一位不相等,返回0,相等返回1
{
if (vt1[m] != vt[m])
return 0;
}
return 1;
}
int main()
{
string s, t;
cin >> s;
cin >> t;
int count=0;
int lens = s.length();
int lent = t.length();
if (lens < lent)
{
cout << count;
return 0;
}
for (int i = 0; i <=lens - lent; i++)
{
string t1 = "";
for (int j = i; j < i + lent; j++) //从s中取出长度与t相等的串t1
t1 = t1 + s[j];
// cout << "t1:" << t1 <<" " <<"t:" << t<<endl;
if (solve(t1, t))
{
count++; //count计数,表示有几个相似的串
// cout << "count" << count<<endl;
}
}
cout << count;
return count;
}