392.leetcode Is Subsequence (medium)[判斷一個字串是否是另一個字串的子串]
Given a string s and a string t, check if s is subsequence of t.
You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, and s is a short string (<=100).
A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, "ace"
"abcde"
while "aec"
is
not).
Example 1:
s = "abc"
, t = "ahbgdc"
Return true
.
Example 2:
s = "axc"
, t = "ahbgdc"
Return false
.
Follow up:
If there are lots of incoming S, say S1, S2, ... , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code?
Subscribe to see which companies asked this question
思路是這樣的,針對子串首先遍歷原串檢查子串中每個不重複字元所在原串的位置陣列記錄下來,然後從開始遍歷子串的每個字元的位置找到第一個大於前一個字元所在位置的就是成功的,這裡由於之前是按照順序遍歷的(因此預設位置是按照從小到大排序的,因此只需要找到第一個大於之前字元位置的位置即可)。最後如果完成了子串字元個次的遍歷,那麼就是成功的,否則就是不成功的。
class Solution { public: bool isSubsequence(string s, string t) { //首先對t中的每個字元在s的進行一次掃描,記錄下相應的位置並且檢測是否都存在 if(s.length() == 0) return true; map<char,vector<int> > status; int valid = 0; set<char> letter; for(int i = 0;i<s.length();i++) letter.insert(s[i]); set<char>::iterator iter = letter.begin(); for( ;iter != letter.end();iter++) for(int j = 0;j<t.length();j++) { if(*iter == t[j]) { status[t[j]].push_back(j); ++valid; } } if(valid<s.length()) return false; int last = 0; int flag = 0; for(int i = 0;i<s.length();i++) { char c = s[i]; vector<int> temp = status[c]; for(int i = 0;i<temp.size();i++) { if(last<= temp[i]) { last = temp[i]; temp.erase(temp.begin()+i); status[c] = temp; flag++; break; } } } if(flag == s.length()) return true; else return false; } };