2022-02-21Leetcode训练营_字符串

天池训练营链接

天池leetcode训练营

验证回文字符串 Ⅱ

时间复杂度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),字符串转数字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值