给定一个主串S(长度<=10^6)和一个模式T(长度<=10^5),要求在主串S中找出与模式T相匹配的子串,返回相匹配的子串中的第一个字符在主串S中出现的位置。 输入格式:输入有两行: 输出格式:输出相匹配的子串中的第一个字符在主串S中出现的位置。若匹配失败,输出0. |
输入样例:
在这里给出一组输入。例如:
aaaaaba
ba
输出样例:
在这里给出相应的输出。例如:
6
考察 : 字符串匹配优化 |
注意 : 这题不需要考虑字符串包含空格 |
思路 : 优化是核心 |
(ps : 这题最普通的find处了最后一个测试点都能过)
C/C++ (简单优化,凑巧过关法)
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
bool flag(long num){
long length = s2.size(),len = s2.size()/2;
for(long z=0;z<len;z++) {
if(s1[z+num]!=s2[z]) return false;
if(s1[num+length-1-z]!=s2[length-1-z]) return false; // 判断的时候头尾开始判断
}
return true;
}
int main()
{
cin >> s1 >> s2;
long len = s1.size()-s2.size();
for(int z=0;z<=len;z++){
if(flag(z)) {
cout << z+1;
return 0;
}
}
cout << 0 << endl;
return 0;
}
深度优化的话,应该得先对字符串就行压缩后再就行判断,这边写了压缩函数,如果对后续感兴趣,可自行尝试
string ZIP(string s){
string result = "";
long num = 1,length = s.size();
char flag = s[0];
for(int z=1;z<length;z++){
if(flag==s[z]) num++;
else
{
if(num>1) result += to_string(num);
result += flag;
num = 1;
flag = s[z];
}
}
if(num>1) result += to_string(num);
result += flag;
return result;
}
// aaaaaba -> 5aba