换了作息,第一天感觉还行。继续努力。
392. Is Subsequence
思路
两个指针分别从字符串从前向后移动,进行匹配。比较好奇的是follow up中的想法,当有大量的小字符串的匹配问题。在交流的过程中提到了ac自动机和kmp算法,但和题目略有不同。一种待深究的思路是,将小字符串做成前缀树。
代码
class Solution {
public:
bool isSubsequence(string s, string t) {
string::iterator ps = s.begin();
string::iterator pt = t.begin();
while(ps != s.end() && pt != t.end()) {
if (*ps == *pt) ps++;
pt++;
}
return ps == s.end();
}
};
279. Perfect Squares
思路
首先是自底向上的动态思想,问题在于运行时间。每一次对于状态量的更新需要用到直接保存的数据,
dp[n] = dp[i] + dp[n-i]
。一般的想法在于从将i
从1到n遍历,稍作优化可以缩小到n到n / 2+1的遍历,但仍是O(n)。其实改题使用的是平方数,所以可以直接按照平方数遍历,从sqrt(n)到1的遍历,实现O(sqrt(n))。
代码
class Solution {
public:
int numSquares(int n) {
vector<int> dp(n+1, 0);
for(int i = 1; i <= n; i++) {
int x = sqrt(i);
if (x * x == i) {
dp[i] = 1;
}
else {
x = INT_MAX;
for (int j = sqrt(i); j >= 1; j--) {
x = min(x, 1 + dp[i-j*j]);
}
dp[i] = x;
}
}
return dp[n];
}
};