天池训练营链接
验证回文字符串 Ⅱ
时间复杂度O(n),空间O(1)
class Solution {
public:
int flag = 0;//删除有没有用过
bool validPalindrome(string s) {
int n=s.size();
int first=0,last=n-1;
//if(n==1 || n==2){
// return true;
//}
while(first<last){
if(s[first] == s[last]){
first+=1;
last-=1;
}
else{//要删除一个再比较
if(flag==1){
return false;//已经删除过1次还有不同的就判定为非回文
}
else{
flag=1;
return validPalindrome(s.substr(first,last-first)) || validPalindrome(s.substr(first+1,last-first));
//删除first或者last两种情况
}
}
}
return true;
//能遍历完到first>=last就返true
//s.substr(pos,length)
}
};
Excel表列名称
class Solution {
public:
string convertToTitle(int columnNumber) {
//26进制
string s="";
while(columnNumber>0){
columnNumber--;//注意这里,这题是1-26转换成A-Z,所以先-1再取余
char ch = 'A'+columnNumber%26;
s+=ch;
columnNumber/=26;
}
reverse(s.begin(),s.end());
return s;
}
};
字符串解码
参考题解
用例试13[ab24[cd]ef]
class Solution {
public:
string decodeString(string s) {
stack<char> st;
for(auto c:s){//这样遍历string可以直接出ch
if(c!=']'){
st.push(c);
}
else{
string s2;//临时存[]内的字符串
//取出[]内的字符串
//string s2;//临时存[]内的字符串
while(!st.empty() && isalpha(st.top())){
s2+=st.top();//模拟一下,这个要反转的
st.pop();
}
reverse(s2.begin(), s2.end());
st.pop();//去除[
//获取倍数数字
string s3;
while(!st.empty() && isdigit(st.top())){
s3+=st.top();
st.pop();
}
reverse(s3.begin(), s3.end());
int count = stoi(s3);
while(count>0){
for(char ch: s2){
st.push(ch);
}
count--;
}
}
}
string ans;
while(!empty(st)){
ans+=st.top();
st.pop();
}
reverse(ans.begin(), ans.end());
return ans;
}
};
另一个思路
这个思路里,<num,res>对中,num是后面[]倍数,res是num后面的[和前面一个[之间的字符串
比如3[a2[c]]中,<num,res>对是<3,"">,<2,“a”>
验证回文串
class Solution {
public:
bool isPalindrome(string s) {
string s1="";
for(auto ch:s){
if(ch>='A' && ch<='Z'){
ch = ch+'a'-'A';
s1+=ch;
}
else if(ch>='0' && ch<='9'){
s1+=ch;
}
else if (ch >= 'a' && ch <= 'z') {
s1 += ch;
}
else {
continue;
}
}
//s变成只有小写字母和数字
if(s1.size()<=1){
return true;
}
int first=0, last=s1.size()-1;
while(first<last){
if(s1[first] != s1[last]){
return false;
}
first++;
last--;
}
return true;
}
};
翻转字符串里的单词
空间复杂度不为O(1)
class Solution {
public:
string reverseWords(string s) {
string cur="";
string ans="";
for(auto ch:s){
if(ch != ' '){
cur+=ch;
}
else{
if(cur != ""){
if(ans==""){
ans=cur;
}
else{
ans=cur+" "+ans;
}
cur="";
}
}
}
if(cur!=""){
if(ans==""){
ans=cur;
}
else{
ans=cur+" "+ans;
}
}
return ans;
}
};
空间复杂度为O(1)的待补充
知识
C++字符串切片用子串
s.substr(pos,length);//length=pos2-pos1+1
反转字符串
reverse(s.begin(),s.end());
一定要找下面高票或者好理解的短的题解代码,尤其官方题解太长太复杂的时候。
#include<ctype.h>
里面有toupper() isdigit() isalpha()等等
C++判断输入是否为字符,数字,空格等
stoi(str),字符串转数字