String算法题目-子串的反转|Java 刷题打卡

188 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

子串反转

题目描述

将一个字符串指定子串反转。如“abcdefg”反转为“abfedcg”

思路分析

通过StringBuiler的reverse()的方法可以实现字符串的整体反转,这里让子串反转可以用分割的方法取出要反转的子串。

解题方法

第一种方法

public String reserve(String str,int start,int end) {
        if (str == null || str.length() == 0) {
            return null;
        }
        char[] arr = str.toCharArray();
        for (int i = start, j = end; i < j; i++, j--) {
            char c=arr[i];
            arr[i]=arr[j];
            arr[j]=c;
        }

        return new String(arr);
    }

将字符串转换为字符数组,通过对应的小标索引来交换数组中字符的位置即可,在最后返回用字符数组创建的字符串

第二种方法

 public String reserve1(String str, int start, int end) {
        if (str == null || str.length() == 0) {
            return null;
        }
        //第一部分
        String s=str.substring(0,start);
        //第二部分:反转子串连接到s
        for (int i = end; i >= start; i--) {
            s+=str.charAt(i);
        }
        //第三部分
        s+=str.substring(end+1);
        return  s;
    }

第二种方法的思路是将最终的字符串分为三个部分来解决,其中前后两个部分为不进行反转的字符串,通过分割连接的方法加到新的字符串中。中间部分,通过连接字符串对应的下标来实现反转,这种方法不许用创建字符数组。

第三种方法(效率改良)

public String reserve2(String str, int start, int end) {
        if (str == null || str.length() == 0) {
            return null;
        }
        StringBuilder s=new StringBuilder(str.length());
        //第一部分
        s.append(str.substring(0,start));
        //第二部分
        for (int i = end; i >= start; i--) {
            s.append(str.charAt(i));
        }
        //第三部分
        s.append(str.substring(end + 1));

        return s.toString();
    }

这个方法思路和第二种一样,不过用的是StringBuilder类型的字符串,在一个字符串上进行操作,不需要不断地开辟空间用于连接新的字符串,效率优于第二种方法。