최 장 답장 서브 문자열 알고리즘 (문자열 처리 문제 + 여러 가지 방법 으로 해결)
                                            
 5857 단어  문자열 처리
                    
회 문 은 바로 읽 고 거꾸로 읽 는 것 을 가리 키 는데, 결 과 는 abc ba 나 abba 와 같다.
제목 은 문자열 에서 가장 긴 답장 문자열 로 가 는 것 입 니 다.
1. 폭력 법
가장 쉽게 생각 나 는 것 은 폭력 적 인 해결 이다. 모든 꼬치 를 구하 고 답장 인지 아 닌 지 판단 해서 가장 긴 것 을 찾 는 것 이다.
각 하위 문자열 의 시간 복잡 도 O (N ^ 2) 를 구하 고 하위 문자열 이 회 문 O (N) 인지 아 닌 지 판단 하 며 둘 은 상승 관계 이기 때문에 시간 복잡 도 는 O (N ^ 3) 입 니 다.
    string findLongestPalindrome(string &s)  
    {  
        int length=s.size();//       
        int maxlength=0;//           
        int start;//             
        for(int i=0;i<length;i++)//      
            for(int j=i+1;j<length;j++)//      
            {  
                int tmp1,tmp2;  
                for(tmp1=i,tmp2=j;tmp1<tmp2;tmp1++,tmp2--)//         
                {  
                    if(s.at(tmp1)!=s.at(tmp2))  
                        break;  
                }  
                if(tmp1>=tmp2&&j-i>maxlength)  
                {  
                    maxlength=j-i+1;  
                    start=i;  
                }  
            }  
            if(maxlength>0)  
                return s.substr(start,maxlength);//     
            return NULL;  
    }  
2. 동적 기획
답장 문자열 의 하위 문자열 도 답장 입 니 다. 예 를 들 어 P [i, j] (i 로 j 로 끝 나 는 하위 문자열 을 표시 합 니 다) 는 답장 문자열 입 니 다. 그러면 P [i + 1, j - 1] 도 답장 문자열 입 니 다.이렇게 하면 가장 긴 회 문 자 열 은 일련의 열 문제 로 분 해 될 수 있다.이렇게 하면 추가 공간 O (N ^ 2) 가 필요 하고 알고리즘 복잡 도 역시 O (N ^ 2) 입 니 다.
우선 상태 방정식 과 전이 방정식 을 정의 합 니 다.
P [i, j] = 0 은 하위 문자열 [i, j] 이 답장 문자열 이 아니 라 는 것 을 나타 낸다. P [i, j] = 1 은 하위 문자열 [i, j] 이 답장 문자열 임 을 나타 낸다.
P[i,i]=1
P[i,j]{=P[i+1,j-1],if(s[i]==s[j])
=0 ,if(s[i]!=s[j])
    string findLongestPalindrome(string &s)  
    {  
        const int length=s.size();  
        int maxlength=0;  
        int start;  
        bool P[50][50]={false};  
        for(int i=0;i<length;i++)//       
        {  
            P[i][i]=true;  
            if(i<length-1&&s.at(i)==s.at(i+1))  
            {  
                P[i][i+1]=true;  
                start=i;  
                maxlength=2;  
            }  
        }  
        for(int len=3;len<length;len++)//      
            for(int i=0;i<=length-len;i++)//        
            {  
                int j=i+len-1;//        
                if(P[i+1][j-1]&&s.at(i)==s.at(j))  
                {  
                    P[i][j]=true;  
                    maxlength=len;  
                    start=i;  
                }  
            }  
        if(maxlength>=2)  
            return s.substr(start,maxlength);  
        return NULL;  
    }  
3. 중심 확장
중심 확장 은 주어진 문자열 의 모든 자 모 를 중심 으로 양쪽 으로 확장 하여 가장 긴 하위 문자열 을 찾 는 것 입 니 다. 알고리즘 복잡 도 는 O (N ^ 2) 입 니 다.
그러나 두 가지 상황 을 고려 해 야 한다.
1. aba 처럼 길이 가 홀수 입 니 다.
2. abba 를 생각 합 니 다. 이렇게 길 이 는 짝수 입 니 다.
    string findLongestPalindrome(string &s)  
    {  
        const int length=s.size();  
        int maxlength=0;  
        int start;  
      
        for(int i=0;i<length;i++)//       
        {  
            int j=i-1,k=i+1;  
            while(j>=0&&k<length&&s.at(j)==s.at(k))  
            {  
                if(k-j+1>maxlength)  
                {  
                    maxlength=k-j+1;  
                    start=j;  
                }  
                j--;  
                k++;  
            }  
        }  
      
        for(int i=0;i<length;i++)//       
        {  
            int j=i,k=i+1;  
            while(j>=0&&k<length&&s.at(j)==s.at(k))  
            {  
                if(k-j+1>maxlength)  
                {  
                    maxlength=k-j+1;  
                    start=j;  
                }  
                j--;  
                k++;  
            }  
        }  
        if(maxlength>0)  
            return s.substr(start,maxlength);  
        return NULL;  
    }  
4. Manacher 법
Manacher 법 은 aba 와 같은 길이 가 홀수 인 리 턴 문자열 만 해결 할 수 있 습 니 다. abba 와 같은 해결 할 수 없 기 때문에 그 안에 특수 문 자 를 추가 합 니 다. 저 는 '\#' 를 추가 하여 abba 를 a\# b\# b\# a 로 만 들 었 습 니 다. 이 알고리즘 은 이미 리 턴 문자열 의 대칭 성 을 이용 하여 계산 한 것 입 니 다. 구체 적 인 알고리즘 복잡 도 는 O (N) 입 니 다. 저 는 알 아 보지 못 했 습 니 다. 두 개의 포 함 된 for 순환 이 있 기 때 문 입 니 다.
구체 적 인 원 리 는 참고 여기, 이곳.
테스트 코드 에서 나 는 '\#' 를 걸 러 내지 않 았 다.
    #define min(x, y) ((x)<(y)?(x):(y))  
    #define max(x, y) ((x)<(y)?(y):(x))  
    string findLongestPalindrome3(string s)  
    {  
        int length=s.size();  
        for(int i=0,k=1;i<length-1;i++)//       #  
        {  
            s.insert(k,"#");  
            k=k+2;  
        }  
        length=length*2-1;//  #        
        int *rad=new int[length]();  
        rad[0]=0;  
        for(int i=1,j=1,k;i<length;i=i+k)  
        {  
            while(i-j>=0&&i+j<length&&s.at(i-j)==s.at(i+j))  
                j++;  
            rad[i]=j-1;  
            for(k=1;k<=rad[i]&&rad[i-k]!=rad[i]-k;k++)//  ,  rad[i-k]=rad[i]-k  ,     j=1      
                rad[i+k]=min(rad[i-k],rad[i]-k);  
      
            j=max(j-k,0);//  j  
              
        }  
        int max=0;  
        int center;  
        for(int i=0;i<length;i++)  
        {  
            if(rad[i]>max)  
            {  
                max=rad[i];  
                center=i;  
            }  
        }  
        return s.substr(center-max,2*max+1);  
      
    }  
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
PHP 문자열 처리 10가지 간단한 방법이것은 쉼표와 구분된 문자열을 데이터로 변환해야 한다는 것을 의미합니다.만약 이 데이터가 처음에 데이터베이스에서 검색되었다면, 그것은 당신에게 하나의 그룹만 제공할 수 있을 것입니다.이 때 implode () 함수를...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.