• 【LeetCode】557. 反转字符串中的单词 III


    题目链接

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

    题目描述

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

    示例:

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

    解题思路

    1.时间复杂度O(n),空间复杂度O(n)

    开辟一个新字符串。然后从头到尾遍历原字符串,直到找到空格为止,此时找到了一个单词,并能得到单词的起止位置。随后,根据单词的起止位置,可以将该单词逆序放到新字符串当中。如此循环多次,直到遍历完原字符串,就能得到翻转后的结果。

    本题也可以采用String的内置函数String[] split(String rex)

    2.时间复杂度O(n),空间复杂度O(1)

    只适用于C++语言,JAVA不适合,因为String类型在JAVA中是不可变的

    AC代码

    解法一:

    class Solution {
        public String reverseWords(String s) {
            if(s.length() == 0) return s;
            StringBuffer ans = new StringBuffer();
            StringBuffer sb = new StringBuffer();
            for(int i = 0; i < s.length(); i++){
                if(s.charAt(i) != ' '){
                    sb.append(s.charAt(i));
                }else{
                    ans.append(sb.reverse().toString());
                    ans.append(' ');
                    sb = new StringBuffer();
                }
            }
            if(sb.length()!=0) ans.append(sb.reverse().toString());
            return ans.toString();
        }
    }
    
    //还是官方的解法更炫酷一点!!!!
    class Solution {
        public String reverseWords(String s) {
            StringBuffer ret = new StringBuffer();
            int length = s.length();
            int i = 0;
            while (i < length) {
                //1.找到单词
                int start = i;
                while (i < length && s.charAt(i) != ' ') {
                    i++;
                }
                //2.反转单词
                for (int p = start; p < i; p++) {
                    ret.append(s.charAt(start + i - 1 - p));
                }
                //3.找空格
                while (i < length && s.charAt(i) == ' ') {
                    i++;
                    ret.append(' ');
                }
            }
            return ret.toString();
        }
    }
    

    解法二:

    class Solution {
    public: 
        string reverseWords(string s) {
            int length = s.length();
            int i = 0;
            while (i < length) {
                int start = i;
                while (i < length && s[i] != ' ') {
                    i++;
                }
    
                int left = start, right = i - 1;
                while (left < right) {
                    swap(s[left], s[right]);
                    left++;
                    right--;
                }
                
                while (i < length && s[i] == ' ') {
                    i++;
                }
            }
            return s;
        }
    };
    
  • 相关阅读:
    Bootstrap 2.2.2 的新特性
    Apache POI 3.9 发布,性能显著提升
    SQL Relay 0.48 发布,数据库中继器
    ProjectForge 4.2.0 发布,项目管理系统
    红帽企业 Linux 发布 6.4 Beta 版本
    红薯 快速的 MySQL 本地和远程密码破解
    MariaDB 宣布成立基金会
    Percona XtraBackup 2.0.4 发布
    Rocks 6.1 发布,光盘机群解决方案
    精通Servlet研究,HttpServlet的实现追究
  • 原文地址:https://www.cnblogs.com/XDU-Lakers/p/13584465.html
Copyright © 2020-2023  润新知