目录
最长子序列
524. Longest Word in Dictionary through Deleting (Medium)
Input:
s = "abpcplea", d = ["ale","apple","monkey","plea"]
Output:
"apple"
题目描述:删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最小字符串。
class Solution {
public:
string findLongestWord(string s, vector<string>& d) {
sort(d.begin(), d.end(), [](string a, string b){
if (a.size() == b.size()) return a < b;
这里的a<b我理解成string类型的字母比较ASCII值
return a.size() > b.size();
});
for (string str : d) {
int i = 0;
for (char c : s) {
if (i < str.size() && c == str[i]) ++i;
}
if (i == str.size()) return str;
}
return "";
}
};
里面的sort的格式很神奇 一般是放一个bool函数 这里很神奇 一般情况
这里的a.size()>b.size()表明是从大到小排列 ,然后中间的if语句不清楚,难道表明当相等的时候按照a小来判断??
class Solution {
public:
string findLongestWord(string s, vector<string>& d) {
string res = "";
for (string str : d) {
int i = 0;
for (char c : s) {
if (i < str.size() && c == str[i]) ++i;
}
if (i == str.size() && str.size() >= res.size()) {
if (str.size() > res.size() || str < res) {
res = str;
}
}
}
return res;
}
};
不用sort了 直接算 不过两个string直接str<res这样对比可以吗????
回文字符串
680. Valid Palindrome II (Easy)
Input: "abca"
Output: True
Explanation: You could delete the character 'c'.
题目描述:可以删除一个字符,判断是否能构成回文字符串。
我的方法有错,太想当然了,在mpcupucupm上 应该删除u 但我删除了c 因为我的做法是当现在两个数不相等时,就看left+1和right是不是相等 若不相等然后再看right-1和left相等吗 就导致了这个问题 这个思路会导致出现两种情况都满足时 可能会出错
class Solution {
public:
bool validPalindrome(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) return isValid(s, left, right - 1) || isValid(s, left + 1, right);
++left; --right;
}
return true;
}
bool isValid(string s, int left, int right) {
while (left < right) {
if (s[left] != s[right]) return false;
++left; --right;
}
return true;
}
};
平方数之和
633 给定一个非负整数 c
,你要判断是否存在两个整数 a
和 b
,使得 a2 + b2 = c。
class Solution {
public:
bool judgeSquareSum(int c) {
unsigned int a = 0, b = sqrt(c);
while (a <= b) {
if (a * a + b * b == c) return true;
else if (a * a + b * b < c) ++a;
else --b;
}
return false;
}
};
刚开始怎么都不满足要求 加了一个unsigned就好啦!
归并两个有序数组
Input:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6], n = 3
Output: [1,2,2,3,5,6]
题目描述:把归并结果存到第一个数组上。 需要从尾开始遍历,否则在 nums1 上归并得到的值会覆盖还未进行归并比较的值。
这个方法不需要再创建一个新数组
这里的判断需要格外注意,while(i>=0 && j>=0)而不是k>=0 写错了会出现异常内存访问
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) nums1[k--] = nums1[i--];
else nums1[k--] = nums2[j--];
}
while (j >= 0) nums1[k--] = nums2[j--];
}
};
还可以更简洁:
class Solution {
public:
void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {
int i = m - 1, j = n - 1, k = m + n - 1;
while (j >= 0) {
nums1[k--] = (i >= 0 && nums1[i] > nums2[j]) ? nums1[i--] : nums2[j--];
}
}
};