給你一個下標從 0 開始的字符串 str1 和 str2 。
一次操作中,你選擇 str1 中的若干下標。對于選中的每一個下標 i ,你將 str1[i] 循環 遞增,變成下一個字符。也就是說 ‘a’ 變成 ‘b’ ,‘b’ 變成 ‘c’ ,以此類推,‘z’ 變成 ‘a’ 。
如果執行以上操作 至多一次 ,可以讓 str2 成為 str1 的子序列,請你返回 true ,否則返回 false 。
注意:一個字符串的子序列指的是從原字符串中刪除一些(可以一個字符也不刪)字符后,剩下字符按照原本先后順序組成的新字符串。
示例 1:
輸入:str1 = “abc”, str2 = “ad”
輸出:true
解釋:選擇 str1 中的下標 2 。
將 str1[2] 循環遞增,得到 ‘d’ 。
因此,str1 變成 “abd” 且 str2 現在是一個子序列。所以返回 true 。
示例 2:
輸入:str1 = “zc”, str2 = “ad”
輸出:true
解釋:選擇 str1 中的下標 0 和 1 。
將 str1[0] 循環遞增得到 ‘a’ 。
將 str1[1] 循環遞增得到 ‘d’ 。
因此,str1 變成 “ad” 且 str2 現在是一個子序列。所以返回 true 。
示例 3:
輸入:str1 = “ab”, str2 = “d”
輸出:false
解釋:這個例子中,沒法在執行一次操作的前提下,將 str2 變為 str1 的子序列。
所以返回 false 。
提示:
1 <= str1.length <= 105^55
1 <= str2.length <= 105^55
str1 和 str2 只包含小寫英文字母。
雙序列雙指針,看兩指針指向的字符是否相同,或是否可以通過循環增長變為另一個字符,如果否,則跳過str1中字符,看最后str2中的字符是否都遍歷完:
class Solution {
public:bool canMakeSubsequence(string str1, string str2) {int idx1 = 0;int idx2 = 0;while (idx1 < str1.size() && idx2 < str2.size()) {if (str1[idx1] == str2[idx2] || char('a' + (str1[idx1] - 'a' + 1) % 26) == str2[idx2]) {++idx2;}++idx1;}return idx2 == str2.size();}
};
如果str1的長度為n,則此算法時間復雜度為O(n),空間復雜度為O(1)。