C++ 最长前缀后缀
给定一个字符串,找出最长的正确前缀的长度,该前缀也是正确的后缀。 例子: S=abab则长度为2,因为前缀为'ab',后缀为'ab'是常见的 这是我使用堆栈的代码。它在某些情况下有效,但在某些情况下无效。我很难理解为什么它在某些情况下不起作用。谁能解释我做错了什么C++ 最长前缀后缀,c++,stack,C++,Stack,给定一个字符串,找出最长的正确前缀的长度,该前缀也是正确的后缀。 例子: S=abab则长度为2,因为前缀为'ab',后缀为'ab'是常见的 这是我使用堆栈的代码。它在某些情况下有效,但在某些情况下无效。我很难理解为什么它在某些情况下不起作用。谁能解释我做错了什么 int main(){ long int T,i,j; /* total test case */ cin>>T>>ws; while(T--){ string str; long int count
int main(){
long int T,i,j;
/* total test case */
cin>>T>>ws;
while(T--){
string str;
long int count = 0;
getline(cin,str);
stack<char> charStack;
/** push all character till second last **/
for(i=0;i!=str.length()-1;i++){
charStack.push(str[i]);
}
j = str.length()-1;
while(!charStack.empty()){
char ch = charStack.top();
charStack.pop();
if(ch==str[j]){
count++;
j--;
}else {
count = 0;
j = str.length()-1;
}
} //inner while
cout<<count<<"\n";
} //outer while
return 0;
}
intmain(){
长整数T,i,j;
/*总测试用例*/
cin>>T>>ws;
而(T--){
字符串str;
长整数计数=0;
getline(cin,str);
堆栈charStack;
/**将所有角色推到倒数第二个**/
对于(i=0;i!=str.length()-1;i++){
charStack.push(str[i]);
}
j=结构长度()-1;
而(!charStack.empty()){
char ch=charStack.top();
charStack.pop();
if(ch==str[j]){
计数++;
j--;
}否则{
计数=0;
j=结构长度()-1;
}
}//内部while
cout问题是,在测试前缀(堆栈)是否与后缀匹配时,您会从堆栈中删除整个匹配部分。有时,这包括真正最长前缀的尾部
我添加了std::cout这是我的KMP代码:-
#include <bits/stdc++.h>
using namespace std;
int main(void){
int t;
scanf("%d",&t);
while(t--){
string s;
cin>>s;
int n = s.length();
int arr[n];
arr[0] = 0;
int len = 0;
for(int i = 1;i<n;){
if(s[len]==s[i]){
len++;
arr[i++] = len;
}
else{
if(len!=0){
len = arr[len-1];
}
else{
arr[i] = 0;
i++;
}
}
}
cout<<arr[n-1]<<endl;
}
return 0;
}
#包括
使用名称空间std;
内部主(空){
int t;
scanf(“%d”、&t);
而(t--){
字符串s;
cin>>s;
int n=s.长度();
int-arr[n];
arr[0]=0;
int len=0;
对于(int i=1;iYou正在比较堆栈顶部(字符串末尾)的字符与字符串末尾(即它们自己)的字符,这很奇怪。它到底在什么情况下失败?堆栈中的最后一项包含字符串的第二个最后一个字符,而不是最后一个字符。
#include <bits/stdc++.h>
using namespace std;
int main(void){
int t;
scanf("%d",&t);
while(t--){
string s;
cin>>s;
int n = s.length();
int arr[n];
arr[0] = 0;
int len = 0;
for(int i = 1;i<n;){
if(s[len]==s[i]){
len++;
arr[i++] = len;
}
else{
if(len!=0){
len = arr[len-1];
}
else{
arr[i] = 0;
i++;
}
}
}
cout<<arr[n-1]<<endl;
}
return 0;
}