反转字符串中的单词

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

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

示例1:

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

解法一:遍历+reversed

思路:首先将字符串以空格来分割成不同的字符串,然后通过遍历将每个字符串然后将其反转。

func reverseWords(_ s: String) -> String {
    guard s.count > 0 else { return ""}
    let words = s.split(separator: " ")
    var result = ""
    words.forEach {
        result += String($0.reversed())
        result += " "
    }
    result.removeLast()
    return result
}

let words = reverseWords("Let's take LeetCode contest")
print(words)

下面我们在playground下面运行的结果,对应每行的效果:

解法二:双指针+异或交换法

双指针法在运行的过程中会有一个头指针固定,尾指针不断向前移动,遇到空格即为头指针和尾指针之间为一个单词,然后对这个单词进行反转即可。

而使用的交换算法是反转字符串中最快速的异或交换法,不过实际上还是一个双指针的解法。

public:
// 反转字符串
void reverseString(int front, int tail, string& str) {
    while (front < tail) {
        str[front] ^= str[tail];
        str[tail] ^= str[front];
        str[front++] ^= str[tail--];
    }
}
// 确定单词边界
string reverseWords(string s) {
    int front = 0;
    for (int i = 0; i < s.length(); i++) {
        if (s[i] == ' ') {
            reverseString(front, i - 1, s);
            front = i + 1;
        }
    }
    reverseString(front, s.length() - 1, s);
    return s;
}

上面是反转字符串的进阶版本,本人觉得第二种方法的异或思想很不错值得大家参考,希望对大家有帮助,谢谢!!!

 

猜你喜欢

转载自www.cnblogs.com/guohai-stronger/p/11747936.html
今日推荐