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^4s包含可打印的 ASCII 字符。s不包含任何开头或结尾空格。s里至少有一个词。s中的所有单词都用一个空格隔开。
557.2 题解
方法一:合成字符串数组
思路
使用 Split 将字符串按空格分割成单词数组。对每个单词,转成字符数组后使用 Array.Reverse 反转。使用 string.Join 将反转后的单词拼接成结果字符串。
核心思想:分割 → 反转每个单词 → 拼接。
具体步骤:
- 使用
Split(' ')分割字符串为单词数组。 - 对每个单词转成字符数组,使用
Array.Reverse反转。 - 使用
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。
核心思想:分割 → 反转每个单词 → 字符串拼接。
具体步骤:
- 使用
Split(' ')分割字符串为单词数组。 - 对每个单词反转后拼接到结果字符串。
- 使用
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