leetcode151-翻转字符串里的单词

原题

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

示例 1:

输入: “the sky is blue”
输出: “blue is sky the”

示例 2:

输入: “ hello world! ”
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:

输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

  • 无空格字符构成一个单词。
  • 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
  • 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

解法

一:直接使用jdk中String的trim()split()方法得到单词的数组,或者遍历字符串字符,记录单词数组。再反向遍历输出。

class Solution {
    public String reverseWords(String s) {
        //"\\s+"代表正则表达式1个或多个空白字符
        String[] words = s.trim().split("\\s+");
        int size = words.length;
        StringBuilder str = new StringBuilder();
        for(int i = 0;i<size;i++){
            str.append(words[size-1-i]);
            if(i!=size-1) str.append(" ");
        }
        return str.toString();
    }
}

二:递归

import "strings"

func reverseWords(s string) string {
    return reverseWordsStart(s, 0)
}

func reverseWordsStart(s string, index int) string {
    res := ""
    started := false
    for i := index; i < len(s); i ++ {
        if s[i] == ' '{
           if started{
                after := reverseWordsStart(s, i+1)
                if after != ""{
                    res = after + " " + res
                }
                return res
           } else{
                continue
           }
        }
        started = true
        res += string(s[i])
    }
    return res
}

三: 先反转整个字符串,再按单词反转,可以实现原地解法,此处省略代码

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode151-%e7%bf%bb%e8%bd%ac%e5%ad%97%e7%ac%a6%e4%b8%b2%e9%87%8c%e7%9a%84%e5%8d%95%e8%af%8d/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年11月20日
下一篇 2019年11月23日

相关推荐

  • leetcode706-设计哈希映射

    原题 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更…

    算法 2019年12月18日
    0120
  • 剑指offer06-从尾到头打印链表

    原题(来源Leetcode) 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。 示例1: 输入: head = [1,3,2] 输出: [2,3,1] 限制: …

    算法 2020年4月10日
    060
  • leetcode26-删除排序数组中的重复项

    原题 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空…

    算法 2019年11月23日
    0190
  • leetcode99-恢复二叉搜索树

    原题 二叉搜索树中的两个节点被错误地交换。 请在不改变其结构的情况下,恢复这棵树。 示例 1: 输入: [1,3,null,null,2]    1 …

    算法 2020年3月1日
    080
  • leetcode198-打家劫舍

    原题 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会…

    算法 2020年5月29日
    060
  • leetcode235-二叉搜索树的最近公共祖先

    原题 给定一个二叉二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x …

    2020年1月17日
    0100
  • leetcode81-搜索旋转排序数组II

    原题 假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定…

    算法 2020年5月30日
    060
  • leetcode76-最小覆盖子串

    原题 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输…

    算法 2020年5月23日
    0170
  • leetcode12-整数转罗马数字

    原题 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2…

    算法 2020年2月29日
    070
  • leetcode215-数组中的第K个最大元素

    原题 在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例1: 输入: [3,2,1,5,6,4] 和…

    算法 2020年2月10日
    0140

发表回复

登录后才能评论