字符串刷题ing

##字符串练习##

151. 翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: “the sky is blue”
输出: “blue is sky the”
示例 2:

输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

class Solution {
public:
    string reverseWords(string s) {
        string res;
        string temp;
        if(s[0]!=' ')
            temp.push_back(s[0]);
        for(int i=1;i<s.length();i++){
            if(s[i]==' ' && s[i-1]==' ')
                continue;
            else if(s[i]==' '){
                if(!res.empty())
                    res = temp +' ' + res;
                else
                    res = temp;
                temp = "";
            }else{
                temp.push_back(s[i]);
            }
        }
        if(!temp.empty() && res.empty())
            res = temp;
        else if(!temp.empty())
            res = temp +' ' + res;
        return res;
    }
};

高赞题解

class Solution {
public:
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        int size = (int)s.size();
        int start = 0; //单词开始
        int end = 0;   //单词末尾
        int index = 0;
        for (; start < size; start++) {
            if (s[start] == ' ') continue;
            if (index != 0){
                //第二个单词开始 开头需要插一个空格 并且使得index指向单词的开始
                s[index++] = ' ';
            }
            end = start;
            //替换原来的s 一直到空格为止
            while (end < size && s[end] != ' ') {
                s[index++] = s[end++];
            }
            //index指向了单词末尾的 下一个字符
            //一个单词的长度
            int len = end - start;
            //index - len就是单词开始的地方
            //s.begin() + index - len 单词开始的位置
            //s.begin() + index 单词结束的位置
            reverse(s.begin() + index - len, s.begin() + index);
            //更新下一个单词的开始位置 start正好指向了空格的位置
            start = end;
            //这一轮循环结束 之后 start++
            //如果只有一个空格 start正好 指向了下一个单词的开始位置
            //如果有多个空格,则指向了下一个空格 下次循环开头会跳过
        }
        //去除末尾的空格和没有用的字符
        s.erase(s.begin() + index, s.end());
        return s;
    }
};

557. 反转字符串中的单词 III

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

class Solution {
public:
    string reverseWords(string s) {
        int size=s.size();
        int start=0;
        int end=0;
        int index = 0;
        for(;start<size;start++){
            if(index!=0)
                s[index++]=' ';
            end=start;
            while(end<size && s[end]!=' ')
                s[index++]=s[end++];
            int len=end-start;
            reverse(s.begin()+index-len,s.begin()+index);
            start=end;
        }
        return s;
    }
};

58. 最后一个单词的长度

给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。

如果不存在最后一个单词,请返回 0 。

说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。

示例:

输入: “Hello World”
输出: 5

class Solution {
public:
    int lengthOfLastWord(string s) {
        int res=0;
        int isfirst=false;
        for(int i=s.size()-1;i>=0;i--){
            if(s[i]==' '){
                if(isfirst)
                    break;
                continue;
            }
            res++;
            isfirst=true;
        }
        return res;
    }
};

709. 转换成小写字母

实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。

示例 1:

输入: “Hello”
输出: “hello”
示例 2:

输入: “here”
输出: “here”
示例 3:

输入: “LOVELY”
输出: “lovely”。

class Solution {
public:
    string toLowerCase(string str) {
        for(int i=0;i<str.size();i++){
            if(str[i]>='A' && str[i]<='Z')
                str[i]=str[i]+32;
        }
        return str;
    }
};

521. 最长特殊序列 Ⅰ

给你两个字符串,请你从这两个字符串中找出最长的特殊序列。

「最长特殊序列」定义如下:该序列为某字符串独有的最长子序列(即不能是其他字符串的子序列)。

子序列 可以通过删去字符串中的某些字符实现,但不能改变剩余字符的相对顺序。空序列为所有字符串的子序列,任何字符串为其自身的子序列。

输入为两个字符串,输出最长特殊序列的长度。如果不存在,则返回 -1。

示例 1:

输入: “aba”, “cdc”
输出: 3
解释: 最长特殊序列可为 “aba” (或 “cdc”),两者均为自身的子序列且不是对方的子序列。
示例 2:

输入:a = “aaa”, b = “bbb”
输出:3
示例 3:

输入:a = “aaa”, b = “aaa”
输出:-1

提示:

两个字符串长度均处于区间 [1 - 100] 。
字符串中的字符仅含有 ‘a’~‘z’ 。

class Solution {
public:
    int findLUSlength(string a, string b) {
        return a==b?-1:max(a.size(),b.size());
    }
};

415. 字符串相加

415. 字符串相加

难度简单184

给定两个字符串形式的非负整数 num1num2 ,计算它们的和。

注意:

  1. num1num2 的长度都小于 5100.
  2. num1num2 都只包含数字 0-9.
  3. num1num2 都不包含任何前导零。
  4. 你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式。

模拟

模拟计算机求解过程

class Solution {
public:
    string addStrings(string num1, string num2) {
        string res;
        int i=num1.size()-1;
        int j=num2.size()-1;
        int carry=0;
        while(i>=0 || j>=0){
            int n1=i>=0?num1[i]-'0':0;
            int n2=j>=0?num2[j]-'0':0;
            int temp=n1+n2+carry;
            carry=temp/10;
            res.push_back(temp%10+'0');
            i--;
            j--;
        }
        if(carry==1)
            res.push_back(1+'0');
        reverse(res.begin(),res.end());
        return res;
    }
};

1

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值