链接:https://leetcode.cn/studyplan/top-interview-150/
392. 判断子序列
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
示例 1:
输入:s = “abc”, t = “ahbgdc”
输出:true
示例 2:
输入:s = “axc”, t = “ahbgdc”
输出:false
提示:
- 0 <= s.length <= 100
- 0 <= t.length <= 10^4
- 两个字符串都只由小写字符组成。
Python代码
class Solution:def isSubsequence(self, s: str, t: str) -> bool:"""搜索s每个字符在t中第一个字符的下标i,每次搜索都缩小范围t[i:]"""len_s = len(s)len_t = len(t)if len_s > len_t:return Falseif len_s == len_t:if s == t:return Trueelse:return Falseindex = 0for i in range(len_s):if s[i] in t[index:]:# 更新下标index = t[index:].index(s[i]) + 1 + indexelse:return Falseelse:return True
if __name__ == '__main__':s = Solution()a = "abc"b = "ahbgdc"print(s.isSubsequence(a, b))
C++代码
#include <iostream>using namespace std;class Solution {
public:bool isSubsequence(string s, string t) {// size()获取字符的长度int s_len = s.size();int t_len = t.size();int index = 0;if(s_len > t_len) return false;if(s_len == t_len){if(s == t) return true;else return false;}// substr()第一个参数是起始下标,第二个元素是长度,该函数是返回一个字符串的子串// find()函数是找字符串中是否包含某个字符,若包含则返回下标,否则返回std::string::nposfor(int i = 0; i < s_len; i++){if (t.substr(index, t_len - index).find(s[i]) != std::string::npos){index = t.substr(index, t_len - index).find(s[i]) + 1 + index;}elsereturn false;}return true;}
};int main()
{string a = "abc";string b = "ahbgdc";Solution s;cout << s.isSubsequence(a, b) << endl;return 0;
}
383. 赎金信
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。
如果可以,返回 true ;否则返回 false 。
magazine 中的每个字符只能在 ransomNote 中使用一次。
示例 1:
输入:ransomNote = “a”, magazine = “b”
输出:false
示例 2:
输入:ransomNote = “aa”, magazine = “ab”
输出:false
示例 3:
输入:ransomNote = “aa”, magazine = “aab”
输出:true
提示:
- 1 <= ransomNote.length, magazine.length <= 10^5
- ransomNote 和 magazine 由小写英文字母组成
Python代码
class Solution(object):def canConstruct(self, ransomNote, magazine):""":type ransomNote: str:type magazine: str:rtype: bool"""# 思路:遍历ransomNote的元素c,每次删除magazine中的c。# 若magazine长度 - ransomNote长度 = 删除后的magazine长度,则返回Truer_len = len(ransomNote)m_len = len(magazine)for i in range(r_len):magazine = magazine.replace(ransomNote[i], "", 1) # 删除一个字符if m_len - r_len == len(magazine):return Trueelse:return Falseif __name__ == '__main__':s = Solution()ransomNote = "a"magazine = "b"print(s.canConstruct(ransomNote, magazine))
C++代码
#include <iostream>using namespace std;class Solution {
public:bool canConstruct(string ransomNote, string magazine) {int r_len = ransomNote.size();int m_len = magazine.size();for(int i = 0; i < r_len; i++){if (magazine.find(ransomNote[i]) != std::string::npos){int index = magazine.find(ransomNote[i]);// erase()函数第一个参数是起始下标,第二个参数是要删除的长度,该函数用于删除字符串中的字串magazine.erase(index, 1);}}if (m_len - r_len == magazine.size()) return true;else return false;}
};int main()
{string a = "aa";string b = "ab";Solution s;cout << s.canConstruct(a, b) << endl;return 0;
}
205. 同构字符串
给定两个字符串 s 和 t ,判断它们是否是同构的。
如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。
每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个字符上,字符可以映射到自己本身。
示例 1:
输入:s = “egg”, t = “add”
输出:true
示例 2:
输入:s = “foo”, t = “bar”
输出:false
示例 3:
输入:s = “paper”, t = “title”
输出:true
提示:
- 1 <= s.length <= 5 * 10^4
- t.length == s.length
- s 和 t 由任意有效的 ASCII 字符组成
Python代码
class Solution:def isIsomorphic(self, s: str, t: str) -> bool:# 将False情况列举出来即可# 1)判断s串当前i是否是之前没出现的,若是,则t串当前i处的字符肯定也是t中之前没出现的# 2)判断s串当前i是否是之前没出现的,若不是,则判断当前t[i] != t[s之前出现过的下标]n = len(s)for i in range(n):if s[i] not in s[:i]:if t[i] in t[:i]:return Falseelse:if t[i] != t[s[:i].index(s[i])]:return Falsereturn Trueif __name__ == '__main__':s = Solution()a = "badc"b = "baba"print(s.isIsomorphic(a, b))
C++代码(超出内存)
class Solution {
public:bool isIsomorphic(string s, string t) {int n = s.size();for(int i = 0; i < n; i++){if (s.substr(0, i).find(s[i]) == std::string::npos){if (t.substr(0, i).find(t[i]) != std::string::npos) return false;}else {if (t[i] != t[s.substr(0, i).find(s[i])]) return false;}}return true;}
};