C++ 最长前缀后缀

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

给定一个字符串,找出最长的正确前缀的长度,该前缀也是正确的后缀。 例子: 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 = 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;
}