소문자 문자열 s가 있다고 가정하고 최대 1자를 삭제하여 s를 유효한 문자열로 변환할 수 있는지 확인해야 합니다. 여기서 유효한 문자열은 str의 모든 고유 문자에 대해 각 문자의 빈도가 동일하도록 문자열 str을 의미합니다.
따라서 입력이 s ="xyyzx"와 같으면 z를 삭제할 수 있으므로 출력은 True가 되고 문자열은 x와 y의 발생이 동일한 "xyyx"가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- 크기:=26
- occurrence :=크기가 26인 배열. 각 문자의 빈도를 s 에 저장합니다.
- occr1 :=0
- occr1_cnt :=0
- 0에서 크기 - 1 사이의 i에 대해
- 발생[i]이 0이 아니면
- occr1 :=발생[i]
- occr1_cnt :=1
- 루프에서 나오다
- 발생[i]이 0이 아니면
- occr2 :=0
- occr2_cnt :=0
- i+1~크기 - 1 범위의 j에 대해
- 발생[j]이 0이 아니면
- 발생[j]이 occr1과 같으면
- occr1_cnt :=occr1_cnt + 1
- 그렇지 않으면
- occr2_cnt :=1
- occr :=발생[j]
- 루프에서 나오다
- 발생[j]이 occr1과 같으면
- 발생[j]이 0이 아니면
- 범위 j+1에서 크기 - 1까지의 k에 대해
- 발생[k]가 0이 아니면
- 발생[k]가 occr1과 같으면
- occr1_cnt :=occr1_cnt + 1
- 발생[k]가 occr2와 같으면
- occr2_cnt :=occr2_cnt + 1
- 그렇지 않으면
- 거짓을 반환
- 발생[k]가 occr1과 같으면
- occr1_cnt> 1 및 occr2_cnt> 1이면
- 거짓을 반환
- 발생[k]가 0이 아니면
- 참 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
size = 26 def solve(str): occurrence = [0]*size for i in range(len(str)): occurrence[ord(str[i])-ord('a')] += 1 occr1 = 0 occr1_cnt = 0 for i in range(size): if (occurrence[i] != 0): occr1 = occurrence[i] occr1_cnt = 1 break occr2 = 0 occr2_cnt = 0 for j in range(i+1,size): if (occurrence[j] != 0): if (occurrence[j] == occr1): occr1_cnt += 1 else: occr2_cnt = 1 occr = occurrence[j] break for k in range(j+1,size): if occurrence[k] != 0: if (occurrence[k] == occr1): occr1_cnt += 1 if (occurrence[k] == occr2): occr2_cnt += 1 else: return False if occr1_cnt > 1 and occr2_cnt > 1: return False return True s = "xyyzx" print(solve(s))
입력
"xyyzx"
출력
True