217. 存在重复元素
先把数组中的元素存到哈希表中如果哈希表中没有这个数字就存下一个数字,再次在找哈希表中找这个数,找到就返回真,
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> s;
for (int x: nums) {
if (s.find(x) != s.end()) {
return true;
}
s.insert(x);
}
return false;
}
};
389.找不同
将字符串中每个字符的 ASCII 码的值求和,得到num1,再把另一个字符串求和得到num2;相减的值即为所求字母的ASCII 码的值
class Solution {
public:
char findTheDifference(string s, string t) {
int num1 = 0, num2 = 0;
for (char ch: s) {
num1 += ch;
}
for (char ch: t) {
num2 += ch;
}
return num2 - num1;
}
};
3. 无重复字符的最长子串
用滑动窗口解决,假设窗口为ABC,当后面的a进入这个窗口时,窗口左边的a删除,依次找出最大的长度
class Solution {
public:
int lengthOfLongestSubstring(string s) {
if(s.size() == 0) return 0;
set<char> lookup;
int maxStr = 0;
int left = 0;
for(int i = 0; i < s.size(); i++)
{
while (lookup.find(s[i]) != lookup.end())
{
lookup.erase(s[left]);
left ++;
}
maxStr = max(maxStr,i-left+1);
lookup.insert(s[i]);
}
return maxStr;
}
};
139. 单词拆分
本题目应当使用动态规划参考背包问题解决。
在遍历的过程中如果满足的区间子串可以由中的单词拼接而成,即。并且中存在一个单词和的区间子串相同,就更新。
状态转移公式:dp[i+len(word)] = dp[i]。
class Solution {
public:
bool wordBreak(string s, vector<string>& wordDict) {
int s_len = s.length();
//定义dp
vector<bool> dp(s_len + 1, false);
//边界条件
dp[0] = true;
for (int i = 0; i < s_len; ++i) {
for (auto& word:wordDict) {
int word_len = word.length();
if (dp[i] && (i + word_len <= s_len) && s.substr(i, word_len) == word) {
//状态转移公式
dp[i + word_len] = dp[i];
}
}
}
return dp[s_len];
}
};