สมมติว่าเรามีจำนวนเต็ม A และ B สองจำนวน เราต้องส่งคืนสตริง S ใด ๆ เช่นนั้น -
-
S มีความยาว A + B และประกอบด้วยตัวอักษร 'a' และหมายเลข 'b' จำนวน A อย่างแน่นอน
-
สตริงย่อย “aaa” และ “bbb” จะไม่อยู่ในสตริง S
ดังนั้นหากจำนวนเต็มที่กำหนดให้คือ A =4, B =1 ผลลัพธ์จะเป็น “aabaa”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดสตริง ret เริ่มแรกว่างเปล่า
-
ในขณะที่ |A – B|>=2,
-
ถ้า A> B แล้ว
-
ret :=ret เชื่อม 'aa'
-
ลด A ลง 2
-
ถ้า B ไม่เท่ากับศูนย์ เชื่อม 'b' กับ ret และลด B ขึ้น 1
-
-
อื่นๆ
-
ret :=ret concatenate 'bb'
-
ลด B ขึ้น 2
-
ถ้า A ไม่เป็นศูนย์ เชื่อม 'a' กับ ret และลด A ลง 1
-
-
-
ขณะที่ A ไม่เป็นศูนย์ หรือ B ไม่ใช่ศูนย์
-
ถ้า A ไม่ใช่ศูนย์และ (ขนาดของ ret <2 หรือไม่ของ (ขนาดของ ret>=2 และองค์ประกอบสุดท้ายของ ret =องค์ประกอบสุดท้ายที่สองของ ret) และองค์ประกอบสุดท้ายของ ret คือ 'a') ดังนั้น
-
ret :=ret + 'a' ลด A ลง 1
-
ถ้า B ไม่ใช่ศูนย์
-
ret :=ret concatenate 'b', ลด B ขึ้น 1
-
-
มิฉะนั้น ret concatenate 'b' ลด B ขึ้น 1 ถ้า A ไม่ใช่ 0 จากนั้นเชื่อม a กับ ret และลด A ลง 1
-
-
-
รีเทิร์น
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: string strWithout3a3b(int A, int B) { string ret = ""; while(abs(A - B) >= 2){ if(A > B){ ret += 'a'; ret += 'a'; A -= 2; if(B) { ret += 'b'; B--; } }else{ ret += 'b'; ret += 'b'; B -= 2; if(A) { ret += 'a'; A--; } } } while(A || B){ if(A && (ret.size() < 2 || !(ret.size() >= 2 && ret[ret.size() - 1] == ret[ret.size() - 2] && ret[ret.size() - 1] == 'a') ) ){ ret += 'a'; A--; if(B) { ret += 'b'; B--; } }else{ ret += 'b'; B--; if(A) { ret += 'a'; A--; } } } return ret; } }; main(){ Solution ob; cout << (ob.strWithout3a3b(4, 1)); }
อินพุต
4 1
ผลลัพธ์
"aabaa"