本文正在参加「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类型的字符串,在一个字符串上进行操作,不需要不断地开辟空间用于连接新的字符串,效率优于第二种方法。