สมมติว่าเรามีสองสตริง 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