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

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


557.1 题目

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

示例 1:

输入:s = "Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输入:s = "Mr Ding"
输出:"rM gniD"

提示:

  • 1 <= s.length <= 5 * 10^4
  • s 包含可打印的 ASCII 字符。
  • s 不包含任何开头或结尾空格。
  • s 里至少有一个词。
  • s 中的所有单词都用一个空格隔开。

557.2 题解

方法一:合成字符串数组

思路

使用 Split 将字符串按空格分割成单词数组。对每个单词,转成字符数组后使用 Array.Reverse 反转。使用 string.Join 将反转后的单词拼接成结果字符串。

核心思想:分割 → 反转每个单词 → 拼接。

具体步骤

  1. 使用 Split(' ') 分割字符串为单词数组。
  2. 对每个单词转成字符数组,使用 Array.Reverse 反转。
  3. 使用 string.Join(" ", words) 拼接结果。

举例:对于 s = "Let's take LeetCode contest"

  • 分割:["Let's", "take", "LeetCode", "contest"]
  • 反转:["s'teL", "ekat", "edoCteeL", "tsetnoc"]
  • 拼接:"s'teL ekat edoCteeL tsetnoc"

复杂度分析

  • 时间复杂度:O(n),遍历字符串一次。
  • 空间复杂度:O(n),存储单词数组和字符数组。

代码

// 方法一:合成字符串数组
// 分割成字符串数组后每个字符串转成字符数组
// 使用Array.Reverse方法反转
// new string传入字符数组形成字符串丢到当前字符串中
// 使用string.Join方法拼接
static string ReverseWords1(string s)
{
    // 分割字符串为单词数组
    string[] words = s.Split(' ');

    // 逐个单词反转
    for (int i = 0; i < words.Length; i++)
    {
        char[] wordChars = words[i].ToCharArray();
        Array.Reverse(wordChars);
        words[i] = new string(wordChars);
    }

    // 拼接反转后的单词数组为结果字符串
    return string.Join(" ", words);
}

方法二:拼接字符串

思路

使用 Split 将字符串按空格分割成单词数组。对每个单词反转后,直接拼接到结果字符串,并添加空格。最后使用 Trim 移除末尾多余的空格。与方法一类似,但使用字符串拼接而非 Join

核心思想:分割 → 反转每个单词 → 字符串拼接。

具体步骤

  1. 使用 Split(' ') 分割字符串为单词数组。
  2. 对每个单词反转后拼接到结果字符串。
  3. 使用 Trim() 移除末尾空格。

复杂度分析

  • 时间复杂度:O(n),遍历字符串一次。
  • 空间复杂度:O(n),存储单词数组和结果字符串。

代码

// 方法二:拼接字符串
// 分割成字符串数组后每个字符串转成字符数组
// 使用Array.Reverse方法反转
// new string传入字符数组形成字符串拼接到结果字符串
// 结果字符串使用Trim移除末尾多余的空格并返回
static string ReverseWords2(string s)
{
    // 分割字符串为单词数组
    string[] words = s.Split(' ');

    // 逐个单词反转并拼接为结果字符串
    string result = "";
    for (int i = 0; i < words.Length; i++)
    {
        char[] wordChars = words[i].ToCharArray();
        Array.Reverse(wordChars);
        result += new string(wordChars) + " ";
    }

    // 移除末尾多余的空格
    result = result.Trim();

    return result;
}

557.3 代码

using System;

class Program
{
    static void Main()
    {
        #region 题目

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

        // 示例 1:
        // 输入:s = "Let's take LeetCode contest"
        // 输出:"s'teL ekat edoCteeL tsetnoc"

        // 示例 2:
        // 输入:s = "Mr Ding"
        // 输出:"rM gniD"

        // 提示:
        // 1 <= s.length <= 5 * 10^4
        // s 包含可打印的 ASCII 字符。
        // s 不包含任何开头或结尾空格。
        // s 里 至少 有一个词。
        // s 中的所有单词都用一个空格隔开。

        #endregion

        #region 测试

        // 示例 1
        string str1 = "Let's take LeetCode contest";
        string result1 = ReverseWords1(str1);
        Console.WriteLine($"示例1 方法1 输出:{result1}");
        string result1_2 = ReverseWords2(str1);
        Console.WriteLine($"示例1 方法2 输出:{result1_2}");

        // 示例 2
        string str2 = "Mr Ding";
        string result2 = ReverseWords1(str2);
        Console.WriteLine($"示例2 方法1 输出:{result2}");
        string result2_2 = ReverseWords2(str2);
        Console.WriteLine($"示例2 方法2 输出:{result2_2}");

        #endregion
    }

    #region 答案

    // 方法一:合成字符串数组
    // 分割成字符串数组后每个字符串转成字符数组
    // 使用Array.Reverse方法反转
    // new string传入字符数组形成字符串丢到当前字符串中
    // 使用string.Join方法拼接
    static string ReverseWords1(string s)
    {
        // 分割字符串为单词数组
        string[] words = s.Split(' ');

        // 逐个单词反转
        for (int i = 0; i < words.Length; i++)
        {
            char[] wordChars = words[i].ToCharArray();
            Array.Reverse(wordChars);
            words[i] = new string(wordChars);
        }

        // 拼接反转后的单词数组为结果字符串
        return string.Join(" ", words);
    }

    // 方法二:拼接字符串
    // 分割成字符串数组后每个字符串转成字符数组
    // 使用Array.Reverse方法反转
    // new string传入字符数组形成字符串拼接到结果字符串
    // 结果字符串使用Trim移除末尾多余的空格并返回
    static string ReverseWords2(string s)
    {
        // 分割字符串为单词数组
        string[] words = s.Split(' ');

        // 逐个单词反转并拼接为结果字符串
        string result = "";
        for (int i = 0; i < words.Length; i++)
        {
            char[] wordChars = words[i].ToCharArray();
            Array.Reverse(wordChars);
            result += new string(wordChars) + " ";
        }

        // 移除末尾多余的空格
        result = result.Trim();

        return result;
    }
    #endregion
}

557.4 运行结果

示例1 方法1 输出:s'teL ekat edoCteeL tsetnoc
示例1 方法2 输出:s'teL ekat edoCteeL tsetnoc
示例2 方法1 输出:rM gniD
示例2 方法2 输出:rM gniD


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏