파이썬에서 가장 긴 회문 문자열 알고리즘
이 글은 주로 Python의 가장 긴 회문 문자열 알고리즘의 실행을 자세히 소개합니다. 여기에는 특정 참조 값이 있습니다. 관심 있는 친구는 이를 참조할 수 있습니다.
문자열이 주어지면 이 문자열에서 찾아야 합니다. 회문 속성. 소위 회문은 "aba", "ababa", "abba"와 같은 문자열을 나타냅니다. 물론 단일 문자와 인접한 두 개의 동일한 문자도 회문 속성을 충족합니다.
이 문제를 볼 때 가장 먼저 떠오르는 해결책은 문자열의 모든 문자열의 시작점을 열거함으로써 회문을 만족하는 부분 문자열을 하나씩 결정하고 길이를 기록하고 가장 긴 것을 업데이트하는 것입니다. 길이. 분명히 이 알고리즘의 시간 복잡도는 매우 높으며 최악의 경우 O(N*N)에 도달할 수 있습니다. 따라서 여기서는 시작점 대신 문자열 부분 문자열의 중심을 열거하고 동시에 양쪽으로 확산시켜 부분 문자열의 회문 특성을 하나씩 판단하는 최적화된 솔루션을 제안합니다. 이 최적화 알고리즘은 최악의 경우(즉, 문자가 하나만 있는 문자열)에서 이전 알고리즘보다 훨씬 더 효율적입니다.
위의 최적화 계획을 통해 점을 열거하는 것보다 중심을 열거하는 것이 더 효율적이라는 것을 알 수 있지만 이는 최적의 알고리즘은 아닙니다. 중심을 열거하는 알고리즘은 중심을 기준으로 양쪽 문자에 동시에 영향을 주기 때문에 중심에서 왼쪽에 있는 문자를 중심으로 열거하고, 중심 문자열의 회문을 판단하면 부분 문자열의 회문을 판단할 수 있다. 중앙의 오른쪽에 있는 문자를 중앙으로 열거하는 것이 관리자 알고리즘입니다.
manacher 알고리즘의 아이디어는 매우 영리합니다. 먼저 i가 열거 중심이고 j(j
1 i는 문자 i'입니다. j에 대해 대칭이다 영향의 범위는 j의 범위에 완전히 포함되며, 그러면 회문으로 인해 i의 영향 범위는 i'의 영향 범위보다 크거나 같습니다. 즉, f[i]> ;=f[i']
2. i에 대한 대칭 문자 i'의 영향 범위는 j의 영향 범위에 완전히 포함되지 않습니다. 이때 i의 오른쪽의 영향 범위는 보다 큽니다. 또는 [j-f[j]/2,i']와 같습니다. 즉, i+f[i]/2> =i'-j+f[j]/2
대칭으로 인해 i+를 얻을 수 있습니다. i" = 2*j. 따라서 첫 번째 경우 f[i]>=f[2*j-i]; 두 번째 경우 f[i]>=f[j]+2*j-2 *i.
위의 1,2를 토대로 f[i]>=min(f[2*j-i ],f[j]+2*j-2*i)를 얻을 수 있습니다. i 오른쪽에 있는 문자는 가장 긴 회문 하위 문자열을 찾을 때까지 양쪽으로 계속 확장됩니다.
i가 여전히 존재하는 경우 j+f[j]/2 이후에는 i가 이전 문자의 영향을 받지 않으며
이 알고리즘은 문자열을 한 번만 탐색하면 되며, 확장 횟수도 O(N)에 도달할 수 있습니다.
다음은 프로그램입니다. Pthon3. 알고리즘의 효율성을 테스트하기 위해 원래의 무차별 열거 알고리즘은 여전히 최악의 알고리즘에 대한 참조로 제공됩니다.
#求最长回文串类 class LPS: #初始化,需要提供一个字符串 def __init__(self,string): self.string = string self.lens = len(self.string) #暴力枚举:作为算法效率参照 def brute_force(self): maxcount = 0 for j in range(self.lens): for k in range(j,self.lens): count = 0 l,m = j,k while m>=l: if self.string[l]==self.string[m]: l,m = l+1,m-1 else: break if m<l: count = k-j+1 if count>maxcount : maxcount = count return maxcount #优化版:枚举子串中心 def brute_force_opti(self): maxcount = 0 if self.lens == 1: #只有一个字符直接返回1 return 1 for j in range(self.lens-1): #枚举中心 count,u = 1,j #对于奇数子串,直接扩展 for k in range(1,j+1): #两边扩展 l,m = u+k,j-k if (m>=0)&(l<self.lens): if(self.string[l]==self.string[m]): count += 2 else: break if count>maxcount : #更新回文子串最长长度 maxcount = count if self.string[j]==self.string[j+1]: #处理偶数子串,将两个相邻相同元素作为整体 u,count= j+1,2 for k in range(1,j+1): #两边扩展 l,m = u+k,j-k if (m>=0)&(l<self.lens): if(self.string[l]==self.string[m]): count += 2 else: break if count>maxcount : #更新回文子串最长长度 maxcount = count return maxcount #manacher算法 def manacher(self): s = '#'+'#'.join(self.string)+'#' #字符串处理,用特殊字符隔离字符串,方便处理偶数子串 lens = len(s) f = [] #辅助列表:f[i]表示i作中心的最长回文子串的长度 maxj = 0 #记录对i右边影响最大的字符位置j maxl = 0 #记录j影响范围的右边界 maxd = 0 #记录最长的回文子串长度 for i in range(lens): #遍历字符串 if maxl>i: count = min(maxl-i,int(f[2*maxj-i]/2)+1)#这里为了方便后续计算使用count,其表示当前字符到其影响范围的右边界的距离 else : count = 1 while i-count>=0 and i+count<lens and s[i-count]==s[i+count]:#两边扩展 count +=1 if(i-1+count)>maxl: #更新影响范围最大的字符j及其右边界 maxl,maxj = i-1+count,i f.append(count*2-1) maxd = max(maxd,f[i]) #更新回文子串最长长度 return int((maxd+1)/2)-1 #去除特殊字符
위 프로그램을 통해 순수 'a' 문자열을 사용합니다. 예를 들어 길이 1000, 테스트됨:
폭력적인 열거: 49.719844s
중앙 열거: 0.334019s
manacher: 0.008000s
길이가 1000일 때 폭력적인 이에 비해 열거형의 효율성이 크게 향상되었으며, 최적의 관리자 시간 소모가 더 짧아졌습니다.
관련 권장 사항:
문자열이 합법적인 IP 주소인지 확인하는 Python 구현주어진 문자열에 대해 모든 하위 시퀀스가 회문 시퀀스인지 확인하는 Python 방법위 내용은 파이썬에서 가장 긴 회문 문자열 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.

VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.

VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.

vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.
