소문자 문자열 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