【LeetCode】字符串合集

对于直接就能使用库函数解决的问题就好不要使用,锻炼自己的编程能力

344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

输入:["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:

输入:["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
class Solution1 {
    
    
public:
    void reverseString(vector<char>& s) {
    
    
        int b=0;
        int e=s.size()-1;

        while(b<e){
    
    
            char tmp=s[b];
            s[b]=s[e];
            s[e]=tmp;
            b++;
            e--;
     }
    }
};

class Solution2 {
    
    
public:
    void reverseString(vector<char>& s) {
    
    
        reverse(s.begin(),s.end());
       
    }
};

class Solution {
    
    
public:
    void reverseString(vector<char>& s) {
    
    
        
        for(int i=0,j=s.size()-1;i<(s.size())/2;i++,j--){
    
    
            swap(s[i],s[j]);
        }
       
    }
};

简单的反转还不够

541. 反转字符串 II
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
 

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"
 

提示:

该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。
class Solution {
    
    
public:
    string reverseStr(string s, int k) {
    
    
        for(int i=0;i<s.size();i+=2*k){
    
    
            if(s.size()-i>=k){
    
    
                reverse(s.begin()+i,s.begin()+i+k);
                continue;
            }
            else
            reverse(s.begin()+i,s.begin()+s.size());
        }
        return s;
    }
};

考察字符串操作的好题

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

 

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

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

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

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
class Solution {
    
    

public:
    string reverseWords(string s) {
    
    
        // 反转整个字符串
        reverse(s.begin(), s.end());

        int n = s.size();
        int idx = 0;
        for (int start = 0; start < n; ++start) {
    
    
            if (s[start] != ' ') {
    
    
                // 填一个空白字符然后将idx移动到下一个单词的开头位置
                if (idx != 0) s[idx++] = ' ';

                // 循环遍历至单词的末尾
                int end = start;
                while (end < n && s[end] != ' ') s[idx++] = s[end++];

                // 反转整个单词
                reverse(s.begin() + idx - (end - start), s.begin() + idx);

                // 更新start,去找下一个单词
                start = end;
            }
        }
        s.erase(s.begin() + idx, s.end());
        return s;
    }
};

很多数组填充类的问题,然后可以预先给数组拓容带填充后的大小,然后从前向后操作

剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

 

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."
 

限制:

0 <= s 的长度 <= 10000


class Solution {
    
    
public:
    string replaceSpace(string s) {
    
    
        int presize=s.size();
        if(presize==0) return "";
        int count=0;
        for(auto c:s){
    
    
            if(c==' ')
            count++;
        }
        //重新分配元素空间
        s.resize(presize+count*2);//*3错了本来就有一个
        int nowsize=s.size();
        //逆序遍历 即可省下时间复杂度
        int low=presize-1;
        int high=nowsize-1;
        while(low>=0){
    
    
            if(s[low]==' '){
    
    
                s[high]='0';
                s[high-1]='2';
                s[high-2]='%';
                high=high-2;
            }
            else{
    
    
                s[high]=s[low];
            }
            high--;
            low--;
        }
        return s;

    }
};

一开始想的太简单以为把所有字符串转换为数字再排序就好,但是数字不能拆开

179. 最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。

示例 1:

输入: [10,2]
输出: 210
示例 2:

输入: [3,30,34,5,9]
输出: 9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
class Solution {
    
    
    static bool cmp(string a,string b){
    
    
        return stoll(a+b)>stoll(b+a);
    }
public:
    
    string largestNumber(vector<int>& nums) {
    
    
        if(!nums.size()) return "";
        string res;
        vector<string> vec;
        for(auto i:nums){
    
    
            string tmp=to_string(i);
            vec.push_back(tmp);
        }
        sort(vec.begin(),vec.end(),cmp);

for(auto s:vec)
res.append(s);
        return res[0]=='0'?"0":res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_37581730/article/details/108456071
今日推荐