151. 翻转字符串里的单词

本文深入探讨了字符串处理的各种方法,包括单词翻转、字符串反转及单词内字符翻转等,提供了多种编程语言实现,如Java、C++和C,适合不同技术水平的读者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

151. 翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例:

输入: "the sky is blue",
输出: "blue is sky the".

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。

java解法:
用split函数切割字符串转化为字符串数组

public class Solution {
    public String reverseWords(String s) {
        if(s.length() == 0 || s == null){
            return "";
        }
        String[] array = s.split(" ");
        StringBuilder sb = new StringBuilder();
        
        for(int i = array.length - 1; i >= 0; i--){
            if(!array[i].equals("")) {
                if (sb.length() > 0) {
                    sb.append(" ");
                }
                
                sb.append(array[i]);
            }
        }
        return sb.toString();
        
    }
}

C++

class Solution {
public:
    void reverseWords(string &s) {
        string res = "";
        int i = s.length() - 1;
        while(i >= 0) {
            while(i >= 0 && s[i] == ' ') {
                i--;
            }
            if(i < 0) {
                break;
            }
            if(res.length() != 0) {
                res.push_back(' ');
            }
            string temp = "";
            while(i >= 0 && s[i] != ' ') {
                temp = s[i] + temp;
                i--;
            }
            res.append(temp);
        }
        s = res;
    }
};

class Solution {
public:
    void reverseWords(string &s) {
        //string res = "";
        int n = s.size();
        int i = 0, j = 0, start = 0;
        while(i < n) {
            while(i < n && s[i] == ' ') {
                i++;
            }
            if(i < n && j > 0) {
                s[j++] = ' ';
            }
            start = j;
            while(i < n && s[i] != ' ') {
                s[j++] = s[i++];
            }
            reverse(s.begin() + start, s.begin() + j);
        }
        s.resize(j);
        reverse(s.begin(), s.end());
        
    }
};

C语言
参考:https://leetcode.com/problems/reverse-words-in-a-string/discuss/47988/0-ms-easy-solution-in-C

void reverse(char *start,char *end)
{
    while(end > start)
    {
        char temp = *start;
        *start = *end;
        *end = temp;
        start++,end--;
    }
}

void trim(char *S)
{
    int count = 0;
    int N = strlen(S);
    int flag = 1;
    for(int i=0;i<N;i++)
    {
        if(S[i] != ' ')
        {
            S[count++] = S[i];
            flag = 0;
        }
        else
        {
            if(!flag)
            {
                S[count++] = S[i];
                flag = 1;
            }
        }
    }
    if(count >= 1 && S[count-1] == ' ')
        S[count-1] = '\0';
    else
        S[count] = '\0';
}

void reverseWords(char *S)
{
    trim(S);
    char *temp = S,*prev = S;
    while(*temp)
    {
        temp++;
        if(*temp == ' ')
        {
            reverse(prev,temp-1);
            prev = temp+1;
        }
        else if(*temp == '\0')
        {
            reverse(prev,temp-1);
        }
    }
    reverse(S,temp-1);
}

344. 反转字符串

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

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

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:

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

示例 2:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    void reverseString(vector<char>& s) {
        int i = 0, j = s.size() - 1;
        char temp;
        while(i < j) {
            temp = s[i];
            s[i] = s[j];
            s[j] = temp;
            i++;
            j--;
        }
    }
};

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

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

示例 1:

输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    string reverseWords(string s) {
        string res = "";
        int start = 0, end = 0;
        for(int i = 0; i < s.size(); i++) {
            string temp = "";
            while(s[i] != ' ' && s[i] != '\0') {
                temp += s[i];
                i++;
            }
            end = i - 1;
            reverse(temp.begin(), temp.end());
            start = i + 1;
            res += temp;
            if(i != s.size()) {
                res += " ";
            }
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值