C++ 中用於子字串搜尋的遞迴函式


給定兩個字串 Str 和 subStr 作為輸入。目標是查詢 subStr 中存在的文字是否在 Str 中作為子字串存在。如果整個字串 X 至少在字串 Y 中出現一次,則稱字串 X 為字串 Y 的子字串。我們將使用遞迴方法來實現這一點。

例如

輸入 − Str = “tutorialspoint” subStr=”Point”

輸出 − 給定字串不包含子字串!

說明 − 字串 Point 不是 tutorialspoint 的子字串

輸入 − Str = “globalization” subStr=”global”

輸出 − 給定字串包含子字串!

說明 − 字串 global 是 globalization 的子字串

下面程式中使用的方法如下

在這種方法中,我們以遞迴的方式檢查 subStr 是否是 Str 的子字串。遞迴步驟如下:

  • 1. 將兩個字串傳遞給一個遞迴函式,其中指標將指向兩個字串的當前字元位置

  • 如果字串已結束但模式還有更多字元剩餘,則返回 0,因為模式未找到並且我們已到達字串的末尾。

  • 如果當前字元是模式中的最後一個字元,則表示它在字串中找到,返回 1。

  • 如果兩個當前字元相同,則將兩個指標都移動到下一個位置。

  • 如果兩個當前字元不匹配,則將字串的指標移動到下一個位置。

  • 將輸入字串作為字元陣列 Str 和 subStr。

  • 函式 match(char *str1, char *substr1) 接收兩個子字串,如果 substr1 和 str1 相同則返回 1。

  • 兩個指標最初指向字串中存在的字元,最初位於起始位置。

  • 如果 substr 為空,則返回 0。

  • 如果兩個字串都為空,則也返回 0。

  • 如果兩個當前字元相等,則使用 match(str1 + 1, substr1 + 1) 遞迴檢查下一個字元。

  • 函式 checksubString(char *str2, char *substr2) 接收兩個字串,如果 substr2 存在於 str2 中則返回 1。

  • 如果 str2 和 substr2 指向的當前字元相同,則使用 match() 函式檢查連續字元是否也匹配。如果返回 1,則返回 1。

  • 如果到達 str2 的末尾,則返回 0。

  • 否則,使用 checksubString(str2 + 1, substr2) 遞迴檢查 str2 的下一個字元。

  • 如果所有條件都失敗,則也使用 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!

更新於: 2021-11-02

1K+ 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.