1. 程式人生 > >《劍指offer》第三十題(串聯所有單詞的子串)

《劍指offer》第三十題(串聯所有單詞的子串)

span words ret http false back 分享圖片 oid ()

技術分享圖片

class Solution {
public:
    void find(string s,vector<string> words, vector<int>& res,
             int len_s,int len_words,int len_word)
    {
        vector<int> index;
        
        for(int i=0;i<len_s-len_word+1;i++)//對於每個字符,看是否是其中一個單詞,是的話編碼,不是的話取-1
        {
            
bool flag=true; for(int j=0;j<len_words;j++) { int k=0; while(k<len_word && words[j][k]==s[i+k]) k++; if(k==len_word) { index.push_back(j+1); flag
=false; break; } } if(flag) index.push_back(-1); } int length=index.size(); int sum=0;//設立兩個標準,一個是編碼的和,一個是編碼之間的異或,註意重復單詞以第一個為準 int chengji=0; for(int
i=0;i<len_words;i++) { bool is_flag=false; for(int j=0;j<i;j++) { if(words[j]==words[i]) { sum+=j+1; chengji= chengji ^ (j+1); is_flag=true; break; } } if(!is_flag) { sum+=i+1; chengji=chengji ^ (i+1); } } for(int i=0;i<length;i++)//對編碼序列進行檢測,滿足上述兩個標準的即可 { int temp=i; int cur_sum=0; int cur_chengji=0; int j=0; while((temp+j*len_word<length) && j<len_words) { cur_sum+=index[temp+j*len_word]; cur_chengji=cur_chengji ^ (index[temp+j*len_word]); j++; } if(cur_sum==sum&&cur_chengji==chengji&&j==len_words) res.push_back(temp); } } vector<int> findSubstring(string s, vector<string>& words) { vector<int> res; int len_s=s.size();//把邊界條件判斷一遍 int len_words=words.size(); if(len_words==0 || len_s==0) return res; int len_word=words[0].size(); if(len_s<len_word) return res; find(s,words,res,len_s,len_words,len_word);//進行查找 return res; } };

分析:

好惡心。

《劍指offer》第三十題(串聯所有單詞的子串)