รับสตริง str1 เป็นอินพุต เป้าหมายคือการแทรก '*' ระหว่างคู่ของอักขระที่เหมือนกันในสตริงอินพุตและส่งคืนสตริงผลลัพธ์โดยใช้วิธีการแบบเรียกซ้ำ
หากสตริงอินพุตเป็น str1="wellness" จากนั้นเอาต์พุตจะเป็น "wel*lnes*s"
ตัวอย่าง
ป้อนข้อมูล − str1="ความสุข"
ผลผลิต − String หลังจากเพิ่ม * :hap*pines*s
คำอธิบาย − การบวก * ระหว่างคู่ pp และ ss จะทำให้เราได้ผลลัพธ์เป็นสตริง hap*pines*s
ป้อนข้อมูล − str1=”swimmmminggggg พูออล”
ผลผลิต − String หลังจากเพิ่ม * :swim*m*m*ming*g*g*g po*o*o*ol
คำอธิบาย − การบวก * ระหว่างคู่ mm, gg และ oo จะให้ผลลัพธ์สตริง swim*m*m*ming*g*g*g po*o*o*ol
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในวิธีนี้ใช้สตริง str1 ในการวนซ้ำแต่ละครั้ง ให้แยก str1 ออกเป็นสองส่วนโดยมีดัชนีปัจจุบันเป็นจุดกึ่งกลาง หากอักขระตัวสุดท้ายของสตริงย่อยแรกเหมือนกับอักขระตัวแรกของสตริงย่อยถัดไป ให้ตั้งค่าสตริงดั้งเดิมเป็นสตริงย่อย 1 ตามด้วย '*' ตามด้วยสตริงย่อย2 สิ้นสุดการเรียกซ้ำในกรณีที่ความยาวของ substring2 เป็น 0
-
นำสตริงอินพุตเป็น str1 และคำนวณความยาวเป็น len
-
ฟังก์ชัน addStar(string&s1, int i, int len1) รับ s1, ความยาวและดัชนีปัจจุบันเป็นอินพุต และเพิ่ม * หากอักขระสองคู่เหมือนกัน..
-
รับ tmp1 เป็นสตริงย่อยของ s1 จากดัชนี 0 ถึง i
-
รับ tmp2 เป็นสตริงย่อยของ s1 จากดัชนี i ถึง len1 + 1
-
หากอักขระตัวสุดท้ายของ tmp1 และอักขระตัวแรกของ tmp2 เท่ากัน ให้ตั้งค่า s1=tmp1+’*’+tmp2
-
โทร addStar(s1, i+1, len1); สำหรับการทำซ้ำครั้งต่อไป
-
ในตอนท้ายให้พิมพ์ str1 ด้านในตัวหลัก
ตัวอย่าง
#include <iostream> using namespace std; void addStar(string& s1, int i, int len1){ string tmp1=s1.substr(0,i); string tmp2=s1.substr(i,len1+1); if (tmp2.length() == 0){ return; } if (tmp1[i-1] == tmp2[0]){ s1 = tmp1 + '*' + tmp2; } addStar(s1, i+1, len1); } int main(){ string str1 = "aabbcccdddd"; int len=str1.length(); addStar(str1, 0, len-1); cout << "String after adding * : "<<str1 << endl; return 0; }
ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
String after adding * : a*ab*bc*c*cd*d*d*d