소문자 ASCII 문자가 포함된 문자열이 있다고 가정하면 이 문자열의 고유한 연속 회문 하위 문자열을 모두 찾아야 합니다.
따라서 입력이 "bddaaa"와 같으면 출력은 [a, aa, aaa, b, d, dd]
가 됩니다.이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- m :=새 지도
- n :=s의 크기
- matrix :=n개의 0으로 구성된 두 개의 행 만들기
- s :="@" 연결 s 연결 "#"
- 0에서 1 사이의 j에 대해 다음을 수행합니다.
- 온도 :=0
- 행렬[j, 0] :=0
- i :=1
- 내가 <=n일 때, 하는 동안
- s[i - temp - 1]은 s[i + j + temp]와 같으나, do
- temp :=온도 + 1
- 행렬[j, i] :=온도
- k :=1
- while(행렬[j, i - k]는 temp - k와 같지 않음) 및 k
- 행렬[j,i+k] :=행렬[j, i-k]의 최소값
- k :=k + 1
- s[i - temp - 1]은 s[i + j + temp]와 같으나, do
- temp :=최대 온도 - k, 0
- i :=i + k
- 0에서 1 사이의 j에 대해 다음을 수행합니다.
- 온도 범위의 경우 수행
- m[(i - temp - 1)에서 (i - temp - 1 + 2 * temp + j)까지 s의 부분 문자열] =1
-
- 온도 범위의 경우 수행
- m[s[i]] :=1
- 디스플레이 i
예
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
def find_substr(s): m = dict() n = len(s) matrix = [[0 for x in range(n+1)] for x in range(2)] s = "@" + s + "#" for j in range(2): temp = 0 matrix[j][0] = 0 i = 1 while i <= n: while s[i - temp - 1] == s[i + j + temp]: temp += 1 matrix[j][i] = temp k = 1 while (matrix[j][i - k] != temp - k) and (k < temp): matrix[j][i+k] = min(matrix[j][i-k], temp - k) k += 1 temp = max(temp - k, 0) i += k s = s[1:len(s)-1] m[s[0]] = 1 for i in range(1,n): for j in range(2): for temp in range(matrix[j][i],0,-1): m[s[i - temp - 1 : i - temp - 1 + 2 * temp + j]] = 1 m[s[i]] = 1 for i in m: print (i) find_substr("bddaaa")
입력
bddaaa
출력
a aa b aaa d dd