Posts 「算法刷题」字符串相关题目1
Post
Cancel

「算法刷题」字符串相关题目1

LeetCode题目相关题目类型相关链接
 t替换空格(简单难度)剑指 Offer 05. 替换空格

题解链接:https://leetcode-cn.com/problems/ti-huan-kong-ge-lcof/solution/mian-shi-ti-05-ti-huan-kong-ge-ji-jian-qing-xi-tu-/ 来源:力扣(LeetCode)

题解上有视频

1、初始化:空格数量 count ,字符串 s 的长度 len ;

2、统计空格数量:遍历 s ,遇空格则 count++ ; 3、修改 s 长度:添加完 “%20” 后的字符串长度应为 len + 2 * count ;

4、倒序遍历修改:i 指向原字符串尾部元素, j 指向新字符串尾部元素;当 i = j 时跳出(代表左方已没有空格,无需继续遍历); 当 s[i] 不为空格时:执行 s[j] = s[i] ; 当 s[i] 为空格时:将字符串闭区间 [j-2, j] 的元素修改为 “%20” ;由于修改了 3 个元素,因此需要 j -= 2 ; 5、返回值:已修改的字符串 s ;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
    string replaceSpace(string s) {
        int count = 0, len = s.size();
        // 统计空格数量
        for (char c : s) {
            if (c == ' ') count++;
        }
        // 修改 s 长度
        s.resize(len + 2 * count);//多加两个空格数,因为字符串本身有一个,再加两个(才能放下%20)
        // 倒序遍历修改
        for(int i = len - 1, j = s.size() - 1; i < j; i--, j--) {
            if (s[i] != ' ')
                s[j] = s[i];
            else {
                s[j - 2] = '%';
                s[j - 1] = '2';
                s[j] = '0';
                j -= 2;
            }
        }
        return s;
    }
};


LeetCode题目相关题目类型相关链接
 剑指offer左旋转字符串(简单难度)剑指 Offer 58 - II. 左旋转字符串 - 力扣(LeetCode) (leetcode-cn.com)
1
2
3
4
5
6
7
8
9
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string str1;
        str1 =s.substr(0,n);
        s.erase(0,n);//即从给定起始位置0处开始删除, 要删除字符的长度为n, 返回值修改后的string对象引用
        return s+str1;
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public:
    string reverseLeftWords(string s, int n) {
        string str="";
        for(int i=n;i<s.size();i++){
            str+=s[i];
        }
        for(int i=0;i<n;i++){
            str+=s[i];
        }
        return str;
    }
};
LeetCode题目相关题目类型相关链接
151反转字符串里的单词(中等难度)151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
class Solution {
public:
    // 反转字符串
    void reverse(string &s,int start,int end){
        int i=start;
        int j=end;
        for(;i<j;i++,j--){
            swap(s[i],s[j]);
        }
    }
    // 移除冗余空格
    // 考虑字符串s前中后空格的位置和fast的大小是否符合循环要求
    void removeExtraStr(string &s){
        int fast=0,slow=0;
        //移除字符串前面多余的空格
        while(s[fast]==' '//表示字符串前有空格
        &&s.size()>0//字符串s不为空
        &&fast<s.size())//fast不能指到s外
        {
            fast++;//结束循环后,fast指向第一个不是空格的字符
        }
        //移除字符串中间多余的空格
        for(;fast<s.size();fast++){
            if(fast-1>0&&
            s[fast]==' '&&
            s[fast-1]==' '){//连续两个空格不做操作
                continue;
            }
            else{//直到fast指向一个字符,前一个是空格,把fast指向的字符赋值给slow指向的位置
                s[slow]=s[fast];
                slow++;
            }
        }
        //移除字符串后面多余的空格
        if(s[slow-1]==' '){//fast指向空格,fast-1指向字符,这时候也执行了s[slow]=s[fast];所以多加了一个空格,如果指向反转字符串的操作,该空格在最前面
            s.resize(slow-1);
        }
        else{
            s.resize(slow);
        }
    }
    string reverseWords(string s) {
        // 移除多余空格
        removeExtraStr(s);
        // 反转字符串
        reverse(s,0,s.size()-1);
        //反转单个单词
        int start=0;
        for(int i=0;i<s.size();i++){
            if(s[i]==' '&&s[i-1]!=' '){
                reverse(s,start,i-1);
                start=i+1;
            }
            // 最后一个单词后没有空格的情况
            if((i == (s.size() - 1) )&& s[i] != ' '){
                reverse(s,start,i);

            }
            
        }
        return s;
        
    }
};
This post is licensed under CC BY 4.0 by the author.