아래의 문제를 해결하고 코드를 게시했습니다. 내 질문에, 현재 구현 파이썬에서 정렬을 사용하고 있습니다 - sorted(sorted_freq, reverse=True)
. 나는 최대 힙 (http://www.geeksforgeeks.org/rearrange-a-string-so-that-all-same-characters-become-at-least-d-distance-away/)을 사용하는 다른 구현을 언급했다. 나는 그들이 동일한 시간 복잡도가 O(n*log n)
이라고 생각한다. (잘못 계산 한 경우, 언제든지 수정하자.) 그래서 정렬 이외의 힙 사용의 성능 측면에서 어떤 이점이 있는지 궁금하네요?힙을 사용하면 문자열 재정렬 성능이 향상됩니다.
내 코드는 Python 2.7로 작성되었습니다.
문제점 : 문자열 양수 D 주어
. 주어진 문자열에서 일부 문자가 반복 될 수 있습니다. 동일한 문자열이 d이 서로 떨어져 있도록 주어진 문자열의 문자를 재정렬하십시오. 가능한 많은 재배치가있을 수 있으며 출력은 가능한 재배치 중 하나 여야합니다. 그러한 합의가 가능하지 않다면, 또한보고되어야한다. 예상 시간 복잡도는 O (n)입니다. 여기서 n은 입력 문자열의 길이입니다.
예 :
Input: "abb", d = 2
Output: "bab"
Input: "aacbbc", d = 3
Output: "abcabc"
Input: "geeksforgeeks", d = 3
Output: egkegkesfesor
Input: "aaa", d = 2
Output: Cannot be rearranged
소스 코드 :
from collections import defaultdict
def rearrange(source, distance):
freq = defaultdict(int)
for c in source:
freq[c] += 1
sorted_freq = []
for k,v in freq.items():
sorted_freq.append((v,k))
sorted_freq = sorted(sorted_freq, reverse=True)
result = [0] * len(source)
for i, (v,k) in enumerate(sorted_freq):
index = i
while index < len(result) and result[index] != 0:
index += 1
if index == len(result):
return None
count = v
while count > 0:
result[index] = k
index += distance
count -= 1
if index >= len(source) and count > 0:
return None
return result
if __name__ == "__main__":
print rearrange('abb', 2)
print rearrange('aacbbc', 3)
print rearrange('geeksforgeeks', 3)
print rearrange('aaa', 2)
niemmi에 대한 조언을 주셔서 감사 드리며 구현을 연구하고 링크를 통해 참조 구현과 비교하십시오.나는 열거 형 (sorted_freq)에서 i, (v, k)에 대한 루프에서 동일한 시간 수를 반복하므로 내 코드 시간 복잡성은'O (n + m log m)'이라고 생각합니다. 고유 한 문자의 수 (귀하의 대답에 'n'은 문자열의 길이를 의미하고 'm'은 문자열의 고유 한 문자 수를 의미합니다). 귀하의 의견을 잘못 읽은 경우 언제든지 저를 바로 잡으십시오. –
BTW, '카운터'사용에 대한 귀하의 생각을 좋아하십시오. –
@LinMa : 네, 고유 한 문자의 양인 외부 루프'm' 번 반복합니다. 그러나 첫 번째 while 루프가 몇 번 실행되는지 생각해보십시오. 위의 예제에서 외부 루프'index'의 첫 번째 반복에서'0'으로 초기화되고'result' [0]는'0'이므로'0' 번 실행됩니다. 두 번째로'index'는''1''이고''result [1 ]''은'0''이므로'0' 번 반복됩니다. 세 번째 라운드에서는'index'가'2'로 초기화되고'result'의 첫 번째 자유 인덱스가'20000'이므로 재미있는 일이 있습니다. 4 회전 '인덱스'는 '3'으로 초기화되고, 첫 번째 자유 인덱스는 '20001'이됩니다. – niemmi