[LeetCode] Is Subsequence 判斷一個字串是否為另一個的子序列
宣告:原題目轉載自LeetCode,解答部分為原創
Problem :
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
.
Solution :
思路:可以用動態規劃的思想來解決,定義bool函式L( i, j ) 返回子串s[ 0, i ] 是否為 t[ 0, j ] 的子序列。則L( i, j )的狀態轉換方程為
if i = -1 : L( i, j ) = true;
else if j = -1 : L( i, j ) = false;
else if s[i] = t[j] : L( i , j ) = L( i -1, j - 1);
else : L( i , j ) = L( i, j - 1);
程式碼如下:
#include<iostream> using namespace std; class Solution { public: /* bool isSubsequence(string s, string t) { return judge(s, t, s.size() - 1, t.size() - 1); } bool judge(string s, string t, int pos_s, int pos_t) { if(pos_s == -1) return true; else if(pos_t == -1) return false; else if(s[pos_s] == t[pos_t]) return judge(s, t, pos_s - 1, pos_t - 1); else return judge(s, t, pos_s, pos_t - 1); } */ bool isSubsequence(string s, string t) { int pos_s = 0; for(int i = 0 ; i < t.size() && pos_s < s.size(); i ++) { if(s[pos_s] == t[i]) pos_s ++; } if(pos_s == s.size()) return true; else return false; } }; int main() { Solution text; cout << text.isSubsequence("ace", "ahencgoe") << endl; return 0; }