สมมติว่าเรามีสองสตริง str1 และ str2 และความยาวของมันเท่ากัน เราต้องตรวจสอบว่าเราสามารถแปลง str1 เป็น str2 โดยทำการแปลงเป็นศูนย์หรือมากกว่า
ในการแปลงครั้งเดียว เราสามารถแปลงการเกิดขึ้นทั้งหมดของอักขระหนึ่งตัวใน str1 เป็นอักขระภาษาอังกฤษตัวพิมพ์เล็กอื่น ๆ เราต้องตรวจสอบว่าเราสามารถแปลง str1 เป็น str2 ได้หรือไม่
ดังนั้น หากอินพุตเป็นเหมือน str1 ="aabcc", str2 ="ccdee" ผลลัพธ์จะเป็นจริง เช่น แปลง 'c' เป็น 'e' จากนั้น 'b' เป็น 'd' จากนั้น 'a' เป็น 'c '. ที่นี่เราต้องจำไว้ว่าลำดับของการแปลงมีความสำคัญ
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชั่นการบีบอัด () นี่จะใช้เวลา s
-
n :=ขนาดของ s
-
a :=รายการใหม่
-
นับ :=1
-
สำหรับผมอยู่ในช่วง 1 ถึง n ทำ
-
ถ้า s[i] ไม่เหมือนกับ s[i-1] แล้ว
-
แทรกนับในตอนท้ายของ a
-
จำนวน:=1
-
-
มิฉะนั้น
-
นับ :=นับ + 1
-
-
-
แทรกนับในตอนท้ายของ a
-
กลับ
-
กำหนดฟังก์ชัน canConvert() นี่จะใช้เวลา str1, str2
-
a :=บีบอัด(str1)
-
b :=บีบอัด (str2)
-
n :=ขนาดของ a, m :=ขนาดของ b
-
d:=แผนที่ใหม่
-
n :=ขั้นต่ำของ n, m
-
ผม :=0
-
ในขณะที่ i
-
ถ้า a[i]>b[i] ไม่ใช่ศูนย์ ดังนั้น
-
คืนค่าเท็จ
-
-
ผม :=ผม + 1
-
-
สำหรับแต่ละ i ใน str2 ทำ
-
ถ้าฉันไม่อยู่ใน d ก็ไม่เท่ากับศูนย์ แล้ว
-
d[i]:=1
-
-
-
คืนค่า True ถ้า 26 - ขนาดของ d ไม่ใช่ศูนย์หรือ str1 เหมือนกับ str2 มิฉะนั้นจะเป็นเท็จ
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
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