LEETCODE: Substring with Concatenation of All Words

You are given a string, S, and a list of words, L, that are all of the same length. Find all starting indices of substring(s) in S that is a concatenation of each word in L exactly once and without any intervening characters.

For example, given:
S: "barfoothefoobarman"
L: ["foo", "bar"]

You should return the indices: [0,9].

(order does not matter).



class Solution {
public:
   vector<int> findSubstring(string S, vector<string> &L) {
      int lengthL = L[0].length() * L.size();
      vector<int> results;
      int gap = S.length() - lengthL;// We do not want to waste time, 
                                     // so if the remain is less than the total, no need to calculate.
      if(gap < 0)
         return results;

      map<string, int> word_count; // One word may appears more than one time.
      for (int ii = 0; ii < L.size(); ++ii) {
            ++word_count[L[ii]];
      }
      
       map<string, int> counting;
      for(int ii = 0; ii <= gap; ii ++) { // Loop through S from 0 to gap.
         counting.clear();
         int jj = ii;
         for(; jj < ii + lengthL; jj += L[0].length()) { // Process string from ii to ii + lengthL.
            string sub = S.substr(jj, L[0].length());
            if(word_count.find(sub) != word_count.end()) {
               ++counting[sub];
               
               if(counting[sub] > word_count[sub]) {
                   break;
               }
            }
            else {
                break;
            }
         }

         if(jj == ii + lengthL) {
            results.push_back(ii);
         }
      }

      return results;
   }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值