กำหนดสองสตริง Str และ subStr เป็นอินพุต เป้าหมายคือการค้นหาว่าข้อความที่มีอยู่ใน subStr มีอยู่ใน Str เป็นสตริงย่อยหรือไม่ สตริง X เรียกว่าสตริงย่อยของ Y หาก X ทั้งหมดมีอยู่ใน Y อย่างน้อยหนึ่งครั้ง เราจะใช้วิธีเรียกซ้ำเพื่อทำสิ่งนี้
ตัวอย่าง
ป้อนข้อมูล − Str =“tutorialspoint” subStr=”Point”
ผลผลิต − สตริงที่ระบุไม่มีสตริงย่อย!
คำอธิบาย − string Point ไม่ใช่ substring ของ tutorialspoint
ป้อนข้อมูล − Str =“โลกาภิวัตน์” subStr=”โลก”
ผลผลิต − สตริงที่ระบุมีสตริงย่อย!
คำอธิบาย − สตริงโกลบอลเป็นสตริงย่อยของโลกาภิวัตน์
แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้
ในแนวทางนี้ เราจะตรวจสอบว่า subStr เป็นสตริงย่อยของ Str ในลักษณะเรียกซ้ำหรือไม่ ขั้นตอนการเรียกซ้ำจะเป็น:-
-
1. ส่งผ่านทั้งสองสตริงไปยังฟังก์ชันแบบเรียกซ้ำ โดยที่พอยน์เตอร์จะชี้ไปที่ตำแหน่งอักขระปัจจุบันของทั้งสองสตริง
-
หากสตริงสิ้นสุดแต่รูปแบบมีอักขระเหลืออยู่ ให้คืนค่า 0 เนื่องจากไม่พบรูปแบบและเราไปถึงที่ส่วนท้ายของสตริง
-
หากอักขระปัจจุบันเป็นอักขระตัวสุดท้ายในรูปแบบ จะพบในสตริง ให้คืนค่า 1
-
หากอักขระปัจจุบันทั้งสองตัวเหมือนกัน ให้ย้ายตัวชี้ทั้งสองไปยังตำแหน่งถัดไป
-
หากอักขระปัจจุบันทั้งสองไม่ตรงกัน ให้ย้ายตัวชี้สำหรับสตริงไปยังตำแหน่งถัดไป
-
รับสตริงอินพุตเป็นอาร์เรย์อักขระ Str และ subStr.
-
การจับคู่ฟังก์ชัน (char *str1, char *substr1) รับสองสตริงย่อยและคืนค่า 1 หาก substr1 และ str1 เหมือนกัน
-
ตัวชี้ทั้งสองชี้ไปที่อักขระที่อยู่ในสตริง โดยเริ่มต้นที่ตำแหน่งเริ่มต้น
-
หาก substr ว่างเปล่า ให้คืนค่า 0
-
หากทั้งสองสตริงว่างเปล่า ให้คืนค่า 0 ด้วย
-
หากอักขระปัจจุบันทั้งสองเท่ากัน ให้ตรวจสอบอักขระถัดไปซ้ำๆ โดยใช้การจับคู่ (str1 + 1, substr1 + 1)
-
ฟังก์ชัน checksubString(char *str2, char *substr2) รับทั้งสตริงและคืนค่า 1 หาก substr2 มีอยู่ใน str2
-
หากอักขระปัจจุบันที่ชี้โดย str2 และ substr2 เหมือนกัน ให้ตรวจสอบว่าอักขระที่ต่อเนื่องกันนั้นตรงกันโดยใช้ฟังก์ชันการจับคู่ () หรือไม่ หากคืนค่า 1 ให้คืนค่า 1
-
หากถึงจุดสิ้นสุดของ str2 ให้คืนค่า 0
-
มิฉะนั้น ให้ตรวจสอบอักขระถัดไปของ str2 ซ้ำๆ โดยใช้ checksubString(str2 + 1, substr2);
-
หากเงื่อนไขทั้งหมดล้มเหลว ให้ตรวจสอบซ้ำโดยใช้checksubString(str2 + 1, substr2);
-
พิมพ์ผลลัพธ์ตามมูลค่าที่ส่งคืน
ตัวอย่าง
#include<iostream>
using namespace std;
int match(char *str1, char *substr1){
if (*substr1 == '\0'){
return 1;
}
if (*str1 == '\0'){
if(*substr1 != '\0'){
return 0;
}
}
if (*str1 == *substr1){
return match(str1 + 1, substr1 + 1);
}
return 0;
}
int checksubString(char *str2, char *substr2){
if (*str2 == *substr2){
if(match(str2, substr2)){
return 1;
}
}
if (*str2 == '\0'){
return 0;
}
else{
return checksubString(str2 + 1, substr2);
}
return checksubString(str2 + 1, substr2);
}
int main(){
char Str[]="tutorialspoint";
char subStr[]="point";
if(checksubString(Str,subStr)==1){
cout << "Given string contains substring!";
}
else{
cout << "Given string does not contain substring!"; }
return 0;
} ผลลัพธ์
หากเรารันโค้ดด้านบน มันจะสร้างผลลัพธ์ต่อไปนี้
Given string contains substring!