일련의 머리와 꼬리가 있다고 가정하면 머리 수가 꼬리 수보다 적지 않은 중요한 부분 문자열 수를 계산하려고합니다. O (NlogN) 시간에 이것을 달성하고 싶습니다.동전 토큰 문자열에서 꼬리가 소수 인 부분 문자열
예 입력 : [ 'H', 'T', 'H', 'T', 'T', 'H' ]
예 출력 :이
11
설명 :
{H} {H} {H}
{H, T} {T, H} {H, T} {T, H}
{H, T, H}
{H, T, H, T}
{H, T, T, H}
{H, T, H, T, T, H}
나는 믿고 내 현재의 알고리즘은 O (N^2). 나는 문제를 재귀 적으로 풀고, 양쪽 끝에서 조각 된 동전 목록을 반복한다.
다음은 현재 사용중인 알고리즘입니다. O (NLogN) 시간을 어떻게 달성 할 수 있습니까?
def count_sequences(data):
print go(range(0,len(data)),data)
seen = set()
def go(rang,data):
if tuple(rang) in seen: return 0
seen.add(tuple(rang))
h = 0
summ = 0
if len(rang)==0: return 0
for i in rang:
if data[i] == 'H': h += 1
summ += go(rang[1:],data)
summ += go(rang[:-1],data)
if len(rang) == 1:
if h ==1: return 1
else: return 0
if h > (len(rang)-1)/2 :
return 1 + summ
else: return summ
특정 문제를 해결하지는 않지만 코드 품질/개선이 더 많은 이러한 질문은 codereview.stackexchange.com –
"모든 하위 집합 찾기"및 "얼마나 많은 하위 시퀀스"가 다른 질문인지에 가장 적합합니다. '{H, T, H, T}}와'{H, T, T, H} '가 다르기 때문에 서브 시퀀스에 관심이 있다는 결과가 나온다. 기하 급수의 하위 시퀀스가있을 수 있습니다. ** O (n log n) 시간에 ** 그들을 열거 할 수 없습니다. 나는 당신이'O (n log n)'시간에 그들을 포함시킬 수 있는지 모르겠습니다. – jfs
@ J.F.Sebastian : 나는 OP가 실제로 하위 문자열을 의미하며 하위 시퀀스 나 하위 집합을 의미하지 않는다고 생각합니다. 그의 예에는'{H, H, T} '하위 시퀀스가 포함되지 않습니다. (또한 제목에는 "adjacent"라는 단어가 포함됩니다.) – rici