代码随想录算法day7 - 字符串1

code4log / 2024-09-05 / 原文

题目1 344. 反转字符串

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

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

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

思路

这道题就正常交换字符的顺序就行了。

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

题目2 541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

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

示例 1:

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

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示:

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

思路

和第一道题的思路一致,要注意的就是到字符串最后的边界位置是否要反转。

class Solution {
public:
    string reverseStr(string s, int k) {
        if(k == 1 || s.size() == 1)
            return move(s);
        for(int i = 0; i < s.size();)
        {
            int lft = i, rht = k - 1 + i >= s.size() ? s.size() - 1 : k - 1 + i;
            while(lft < rht)
            {
                char c = s[lft];
                s[lft] = s[rht];
                s[rht] = c;
                lft++;
                rht--;
            }
            i += 2 * k;
        }
        return move(s);
    }
};

题目3 54. 替换数字

题目描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

输入描述

输入一个字符串 s,s 仅包含小写字母和数字字符。

输出描述

打印一个新的字符串,其中每个数字字符都被替换为了number

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

提示信息

数据范围:
1 <= s.length < 10000。

思路

额外空间法

用两个string就可以解决这道题,第一个string对象用于保存输入示例,第二个string对象用于存储判断后的字符或number。

#include<iostream>
#include<string>


int main()
{
    using namespace std;
    string input,
           result;
    cin >> input;
    for(auto &c : input)
    {
        if(c >= '1' && c <= '9')
        {
            result += string("number");
        }
        else
            result += c;
    }
    cout << result;
    return 0;
}

扩容填充法*

这道题可以先遍历一遍,确认字符串中的数字数目,之后对string对象扩容,最后从后向前遍历得出结果。

#include<iostream>
#include<string>


int main()
{
    using namespace std;
    string result;
    cin >> result;
    int num = 0;
    for(auto &c : result)
    {
        if(c >= '0' && c <= '9')
            num++;
    }
    int lstIndex = result.size() - 1;
    result.resize(result.size() + 5 * num);
    for(int i = result.size() - 1; i >= 0; i--)
    {
        if(result[lstIndex] >= '0' && result[lstIndex] <= '9')
        {
            result[i--] = 'r';
            result[i--] = 'e';
            result[i--] = 'b';
            result[i--] = 'm';
            result[i--] = 'u';
            result[i] = 'n';
        }
        else
        {
            result[i] = result[lstIndex];
        }
        lstIndex--;
    }
    cout << result;
    return 0;
}