巧妙方法:
1.一个很好的判断是否是回文串的方法(只有要求s里每个子串是否是回文串的时候才用得上)。思路是动态规划。dp[i][j]代表字串s的i到j是否是回文串。
公式是:如果i>=j:dp[i][j]=true;
否则:当(s[i]==s[j])并且dp[i+1][j-1]为真时dp[i][j]为真
vector<vector<int>> f(n,vector<int>(n,true); //默认为真
for(int i=n-1;i>=0;--i){
for(int j=0;j<n;++j){
f[i][j]=(s[i]==s[j])&&f[i+1][j-1];
}
}
//之后f[i][j]就可以查到是否是回文串
数据结构:
1.priority_queue的less是大根堆,greater是小根堆。
2.string的比大小结果:第一个不同那一位,阿紫科码比较大的,大。如果串a是串b的前面一部分,那么b大于a。
降低空间复杂度:
1.将数组中的负数剔除(将它变成一个很大的数),然后将特定位置的元素取负就可以达到标记这个位置的效果,原地哈希。
易出错点:
1.range for的一个缺点:
//下面这种情况nums中的元素其实根本就没有改变,改变的只是临时变量i
for(int i:nums){
i=-i;
}
//下面的写法才是正确的
for(int i=0;i<nums.size();i++){
nums[i]=-nums[i];
}
//还有一种办法,把临时量定义成引用
for(int &i:nums){
i=-i;
}
2.sort函数的第三个参数cmp函数需要写成static。
常用函数记录:
1.pow(a,b) 这是取幂的函数。