두 개의 문자열 str1과 str2가 있다고 가정합니다. 그리고 길이가 같으므로 0개 이상의 변환을 수행하여 str1을 str2로 변환할 수 있는지 확인해야 합니다.
한 번의 변환으로 str1에서 한 문자의 모든 발생을 다른 소문자 영어 문자로 변환할 수 있습니다. str1을 str2로 변환할 수 있는지 여부를 확인해야 합니다.
따라서 입력이 str1 ="aabcc", str2 ="ccdee"와 같으면 'c'를 'e'로 변환한 다음 'b'를 'd'로 변환한 다음 'a'를 'c로 변환하여 출력이 true가 됩니다. '. 여기서 전환 순서가 중요하다는 점을 명심해야 합니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
compress() 함수를 정의합니다. 시간이 걸립니다
-
n :=s
의 크기 -
a :=새 목록
-
개수 :=1
-
범위 1에서 n까지의 i에 대해 수행
-
s[i]가 s[i-1]과 같지 않으면
-
끝에 카운트 삽입 -
개수:=1
-
-
그렇지 않으면
-
개수 :=개수 + 1
-
-
-
끝에 카운트 삽입 -
반환
-
canConvert() 함수를 정의합니다. str1, str2가 필요합니다.
-
a :=압축(str1)
-
b :=압축(str2)
-
n :=a의 크기, m :=b의 크기
-
d:=새 지도
-
n :=n의 최소값, m
-
나는 :=0
-
i
-
a[i]>b[i]가 0이 아니면
-
거짓을 반환
-
-
나는 :=나는 + 1
-
-
str2의 각 i에 대해 수행
-
i가 d에 없으면 0이 아닌 경우
-
d[i]:=1
-
-
-
26 - d의 크기가 0이 아니거나 str1이 str2와 같으면 True 반환, 그렇지 않으면 False
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
class Solution(object):
def compress(self,s):
n = len(s)
a = []
count = 1
for i in range(1,n):
if s[i]!=s[i-1]:
a.append(count)
count=1
else:
count+=1
a.append(count)
return a
def canConvert(self, str1, str2):
a = self.compress(str1)
b = self.compress(str2)
n = len(a)
m = len(b)
d={}
n = min(n,m)
i = 0
while i<n:
if a[i]>b[i]:
return False
i+=1
for i in str2:
if i not in d:
d[i]=1
return True if 26-len(d) or str1 == str2 else False
ob = Solution()
print(ob.canConvert("aabcc", "ccdee")) 입력
"aabcc", "ccdee"
출력
True