최대 대칭 문자열 의 알고리즘
문자열 의 대칭 여 부 를 밖에서 안 으로 판단 합 니 다.O(n)
#include <stdio.h>
#include <string.h>
/*
* ,
*/
int IsSymmetrical(char* pBegin, char* pEnd)
{
if(pBegin == NULL || pEnd == NULL || pBegin > pEnd)
return 0;
while(pBegin < pEnd)
{
if(*pBegin != *pEnd)
return 0;
pBegin++;
pEnd--;
}
return 1;
}
/*
* , O(n^3)
*/
int GetLongestSymmetricalLength(char* pString)
{
if(pString == NULL)
return 0;
int symmetricalLength = 1;
char* pFirst = pString;
int length = strlen(pString);
while(pFirst < &pString[length-1])
{
char* pLast = pFirst + 1;
while(pLast <= &pString[length-1])
{
if(IsSymmetrical(pFirst, pLast))
{
int newLength = pLast - pFirst + 1;
if(newLength > symmetricalLength)
symmetricalLength = newLength;
}
pLast++;
}
pFirst++;
}
return symmetricalLength;
}
int main()
{
char* str = "google";
int len = GetLongestSymmetricalLength(str);
printf("%d", len);
return 0;
}
알고리즘 2:O(n^2)문자열 의 대칭 여 부 를 밖에서 안 으로 판단 합 니 다.O(1)
#include <stdio.h>
#include <string.h>
int GetLongestSymmetricalLength(char* pString)
{
if(pString == NULL)
return 0;
int symmetricalLength = 1;
char* pChar = pString;
while(*pChar != '\0')
{
// , aAa
char* left = pChar - 1;
char* right = pChar + 1;
while(left >= pString && *right != '\0' && *left==*right)
{
left--;
right++;
}
int newLength = right - left - 1; // *left!=*right
if(newLength > symmetricalLength)
symmetricalLength = newLength;
// , aAAa
left = pChar;
right = pChar + 1;
while(left >= pString && *right != '\0' && *left==*right)
{
left--;
right++;
}
newLength = right - left - 1; // *left!=*right
if(newLength > symmetricalLength)
symmetricalLength = newLength;
pChar++;
}
return symmetricalLength;
}
int main()
{
char* str = "google";
int len = GetLongestSymmetricalLength(str);
printf("%d", len);
return 0;
}
알고리즘 3:manacher 알고리즘원본 문자열:abaab 새 문자열:\#a\#b\#a\#b\#이렇게 되면 원래 의 홀수 길이 의 답장 문자열 은 홀수 길이 이 고 짝수 길이 도'\#'를 중심 으로 하 는 홀수 답장 문자열 이 됩 니 다.다음은 알고리즘 의 중심 사상 입 니 다.보조 배열 P 로 모든 문 자 를 중심 으로 하 는 가장 긴 회 문 반지름,즉 P[i]기록 은 Str[i]문 자 를 중심 으로 하 는 가장 긴 회 문 꼬치 반지름 입 니 다.P[i]최소 1,이때 답장 문자열 은 Str[i]자체 입 니 다.우 리 는 상기 예 에 대해 P 배열 을 쓸 수 있 습 니 다.다음 과 같은 새 문자열 을 쓸 수 있 습 니 다.\#a\#a\#b\#P[] : 1,2,1,4,1,2,1,2,1.우 리 는 P[i]-1 이 바로 Str[i]를 중심 으로 하 는 회 문 꼬치 의 길 이 를 증명 할 수 있다.증명:1.분명히 L=2*P[i]-1 은 새 꼬치 중 Str[i]를 중심 으로 가장 긴 회 문 꼬치 길이 입 니 다.2.Str[i]를 중심 으로 하 는 리 턴 문자열 은 반드시\#로 시작 하고 끝 납 니 다.예 를 들 어'\#b\#'또는'\#b\#a\#b\#'이기 때문에 L 에서 맨 앞 이나 마지막'\#'문 자 를 빼 면 원래 문자열 의 길이 의 두 배 입 니 다.즉,원래 문자열 의 길 이 는(L-1)/2 이 고 간단 한 P[i]-1 입 니 다.증 거 를 얻다.
주:잘 모 르 겠 어 요.
#include <stdio.h>
#include <string.h>
int GetLongestSymmetricalLength(char* pString)
{
int length = strlen(pString);
char* pNewString = malloc(2*length+2);
int i;
for(i=0; i<length; i++)
{
*(pNewString+i*2) = '#';
*(pNewString+i*2+1) = *(pString+i);
}
*(pNewString+2*length) = '#';
*(pNewString+2*length+1) = '\0';
printf("%s
", pNewString);
int maxLength = 1;
char* pChar;
for(i=0; i<2*length+2; i++)
{
int newLength = 1;
pChar = pNewString + i;
char* left = pChar-1;
char* right = pChar+1;
while(left>=pNewString && *right!='\0'&& *left==*right)
{
left--;
right++;
newLength++;
}
if(newLength > maxLength)
maxLength = newLength;
}
return maxLength-1;
}
int main()
{
char* str = "google";
int len = GetLongestSymmetricalLength(str);
printf("%d", len);
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift 연습 Swift3에서 문자열을 정수로 변환하는 방법Swift3에서 문자열을 정수로 변환하는 방법 Swift3.swift Swift3.log 그럼 실패하지 않는 방법 Swift3.swift Swift3.log Swift1.x에서는, ""12345""라고 하는 정수를 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.