查詢由C++中列表(L)中所有單詞連線而成的字串(S)中子字串的起始索引


假設我們有一個字串s,還有一個包含一些單詞的列表,這些單詞長度相同。我們必須找到字串s中所有子字串的起始索引,這些子字串是由列表b中的每個單詞恰好連線一次構成的,並且沒有任何其他字元。

例如,如果輸入是“wordgoodgoodgoodword”並且單詞列表是["word","good"],則輸出將是[0,12]。這是因為從索引0和12開始的子字串分別是“wordgood”和“goodword”。

為了解決這個問題,我們將遵循以下步驟:

  • 定義一個名為ok()的方法,它將接收字串s,map wordCnt和n作為引數:

  • 將s複製到temp中

  • 對於i從n到s的長度-1

    • 如果temp的長度是n的倍數,則

      • 如果wordCnt中不存在temp,則返回false

      • 否則

        • 如果wordCnt[temp]為1,則從wordCnt中刪除temp,並將temp設定為空字串

        • 否則,將wordCnt[temp]的值減少1,並將temp設定為空字串。

    • 將s[i]新增到temp中

  • 如果wordCnt中不存在temp,則返回false

  • 否則

    • 如果wordCnt[temp]為1,則從wordCnt中刪除temp,並將temp設定為空字串

    • 否則,將wordCnt[temp]的值減少1,並將temp設定為空字串。

  • 如果wordCnt的長度為0,則返回true

  • 在主方法中,執行以下操作:

  • 如果a的長度為0或b的長度為0,則返回空陣列

  • 建立一個map wordCnt,將b中字串的頻率儲存到wordCnt中

  • 建立一個名為ans的陣列

  • window := 單詞數量 x 每個單詞的字元數量

  • 將字串a複製到temp中

  • 對於i從window到a的長度-1

    • 如果temp的長度可以被window整除,並且呼叫ok(temp, wordCnt, b[0]的長度),則

      • 將i - window插入到ans中

    • 將a[i]插入到temp中

    • 如果temp的長度 > window,則刪除從0到1的子字串

  • 如果temp的長度可以被window整除,並且呼叫ok(temp, wordCnt, b[0]的長度),則

    • 將a的長度 - window插入到ans中

  • 返回ans

示例(C++)

讓我們來看下面的實現,以便更好地理解:

線上演示

#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
   cout << "[";
   for(int i = 0; i<v.size(); i++){
      cout << v[i] << ", ";
   }
   cout << "]"<<endl;
}
class Solution {
public:
   bool ok(string s, unordered_map <string, int> wordCnt, int n){
      string temp = "";
      for(int i = 0; i < n; i++){
         temp += s[i];
      }
      for(int i = n; i < s.size(); i++){
         if(temp.size() % n == 0){
            if(wordCnt.find(temp) == wordCnt.end())return false;
            else{
               if(wordCnt[temp] == 1){
                  wordCnt.erase(temp);
                  temp = "";
               } else {
                  wordCnt[temp]--;
                  temp = "";
               }
            }
         }
         temp += s[i];
      }
   if(wordCnt.find(temp) == wordCnt.end())return false;
   else{
      if(wordCnt[temp] == 1){
         wordCnt.erase(temp);
         temp = "";
      } else {
         wordCnt[temp]--;
         temp = "";
      }
   }
   return wordCnt.size() == 0;
}
vector<int>findSubstring(string a, vector<string> &b) {
   if(a.size() == 0 || b.size() == 0)return {};
      unordered_map <string, int> wordCnt;
   for(int i = 0; i < b.size(); i++)wordCnt[b[i]]++;
      vector <int> ans;
      int window = b.size() * b[0].size();
      string temp ="";
      for(int i = 0; i < window; i++)temp += a[i];
      for(int i = window; i < a.size(); i++){
         if(temp.size() % window == 0 && ok(temp, wordCnt, b[0].size())){
            ans.push_back(i - window);
         }
         temp += a[i];
         if(temp.size() > window)temp.erase(0, 1);
      }
      if(temp .size() % window ==0 && ok(temp, wordCnt, b[0].size()))ans.push_back(a.size() - window);
         return ans;
   }
};
main(){
   vector<string> v = {"word","good"};
   Solution ob;
   print_vector(ob.findSubstring("wordgoodgoodgoodword", v));
}

輸入

“wordgoodgoodgoodword”, {"word","good"}

輸出

[0, 12, ]

更新於:2020-08-27

144 次瀏覽

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告