P.S 非科班出身,对C++和算法较陌生,从入门开始,使用的是牛客网平台,刷题借鉴了很多前人的思路,博客仅为记录用。
问题1:反转字符串【NC103】
问题描述:接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
问题要求:空间复杂度
O
(
n
)
O(n)
O(n),时间复杂度
O
(
n
)
O(n)
O(n)
解题思路:新建一个字符串,将原字符串倒序写入新的字符串。
代码:
class Solution {
public:
/**
* 反转字符串
* @param str string字符串
* @return string字符串
*/
string solve(string str)
{
// write code here
int len = str.length();
string newstr =str;
for (int i=0;i<len;++i)
newstr[i] = str[len-1-i];
return newstr;
}
};
注意点:
- 字符串长度获取:
str.length();
- 在此代码中,for循环中的++i与i++功能是一致的,但是i++由于是在使用当前值之后再+1,所以需要一个临时的变量来转存;而++i则是在直接+1,省去了对内存的操作的环节,相对而言能够提高性能;
- 在其他的代码书写时,如赋值,++i可以作为赋值对象;先赋值,再运算。
参考资料:
知乎:i++和++i有什么区别
问题2:最长回文子串【NC17】
问题描述:对于一个字符串(仅包含小写英文字母),然后输出该字符串最长回文子串的长度。(字符串长度不超过1000)
回文子串:指的是正反相同的字符串
问题要求:空间复杂度
O
(
1
)
O(1)
O(1),时间复杂度
O
(
n
2
)
O(n^2)
O(n2)
解题思路:分为两步,提取子字符串,判断子字符串是否为回文子字符串。
代码:
class Solution {
public:
int getLongestPalindrome(string A, int n) {
// write code here
int maxPali = 1;
for (int i=0;i<n;++i){
for (int j=i+maxPali;j<n;++j){
if (isPalindrome(A.substr(i,j-i+1)))
maxPali = j-i+1;
}
}
return maxPali;
}
bool isPalindrome(string s){
string new_s = s;
reverse(new_s.begin(),new_s.end());
if (new_s == s)
return true;
return false;
}
};
注意点:
- 字符串字串获取:str.substr(起始位置, 子字符串长度);
- 此代码要用到问题一的反转字符串代码,此处也可直接使用reverse函数,用法为
reverse(str.begin(),str.end());