s0030
This commit is contained in:
		
							
								
								
									
										15
									
								
								include/s0030_substring_with_concatenation_of_all_words.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								include/s0030_substring_with_concatenation_of_all_words.hpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,15 @@
 | 
			
		||||
#ifndef S0030_SUBSTRING_WITH_CONCATENATION_OF_ALL_WORDS
 | 
			
		||||
#define S0030_SUBSTRING_WITH_CONCATENATION_OF_ALL_WORDS
 | 
			
		||||
 | 
			
		||||
#include <vector>
 | 
			
		||||
#include <string>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
 | 
			
		||||
using namespace std;
 | 
			
		||||
 | 
			
		||||
class Solution {
 | 
			
		||||
 public:
 | 
			
		||||
  vector<int> findSubstring(string s, vector<string>& words);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										33
									
								
								src/s0030_substring_with_concatenation_of_all_words.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/s0030_substring_with_concatenation_of_all_words.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
#include "s0030_substring_with_concatenation_of_all_words.hpp"
 | 
			
		||||
 | 
			
		||||
vector<int> Solution::findSubstring(string s, vector<string>& words) {
 | 
			
		||||
  vector<int> res;
 | 
			
		||||
  int m = words.size(), n = words[0].size(), ls = s.size();
 | 
			
		||||
  for (int i = 0; i < n && i + m * n <= ls; ++i) {
 | 
			
		||||
    unordered_map<string, int> differ;
 | 
			
		||||
    for (int j = 0; j < m; ++j) {
 | 
			
		||||
      ++differ[s.substr(i + j * n, n)];
 | 
			
		||||
    }
 | 
			
		||||
    for (string& word : words) {
 | 
			
		||||
      if (--differ[word] == 0) {
 | 
			
		||||
        differ.erase(word);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    for (int start = i; start < ls - m * n + 1; start += n) {
 | 
			
		||||
      if (start != i) {
 | 
			
		||||
        string word = s.substr(start + (m - 1) * n, n);
 | 
			
		||||
        if (++differ[word] == 0) {
 | 
			
		||||
          differ.erase(word);
 | 
			
		||||
        }
 | 
			
		||||
        word = s.substr(start - n, n);
 | 
			
		||||
        if (--differ[word] == 0) {
 | 
			
		||||
          differ.erase(word);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (differ.empty()) {
 | 
			
		||||
        res.emplace_back(start);
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return res;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								tests/s0030_substring_with_concatenation_of_all_words.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tests/s0030_substring_with_concatenation_of_all_words.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#include "s0030_substring_with_concatenation_of_all_words.hpp"
 | 
			
		||||
 | 
			
		||||
#include <gtest/gtest.h>
 | 
			
		||||
 | 
			
		||||
TEST(Problem30, Case1) {
 | 
			
		||||
  string s{"barfoothefoobarman"};
 | 
			
		||||
  vector<string> words{"foo", "bar"};
 | 
			
		||||
  vector<int> o{0, 9};
 | 
			
		||||
  Solution solution;
 | 
			
		||||
  EXPECT_EQ(solution.findSubstring(s, words), o);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
TEST(Problem30, Case2) {
 | 
			
		||||
  string s{"wordgoodgoodgoodbestword"};
 | 
			
		||||
  vector<string> words{"word","good","best","word"};
 | 
			
		||||
  vector<int> o{};
 | 
			
		||||
  Solution solution;
 | 
			
		||||
  EXPECT_EQ(solution.findSubstring(s, words), o);
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user