对字符串进行旋转必须操作
案例1
判断一个字符串是否为另一个字符串的旋转字符串
例如:1234 的旋转字符串为: 1234 2341 3412 4123
可以新建字符串 str = 12341234;(两个字符串叠加,其中包含了所有该字符串的旋转字符串)
只要判断 str 中包含了字符,则其就是旋转字符串
public boolean chkRotation(String A, int lena, String B, int lenb) {
// write code here
return (A+A).contains(B);
}
案例2
将 str1 = pig loves dog 逆序成 str2 = god loves pig
1、将字符串 str1 头尾交换,直到中间为止,得到:god sevol gip
2、再将每一个单词逆序,得到:dog loves pig
public static String reverseSentence(String A, int n) {
if (A == null || n == 0) {
return A;
}
char[] s = A.toCharArray();
rotateWord(s);
return String.valueOf(s);
}
private static void rotateWord(char[] chars) {
if (chars == null || chars.length == 0) {
return;
}
reverse(chars, 0, chars.length-1);//字符串整体逆序
//至此字符串变为:gip sevol god
int left = -1;
int right = -1;
for (int i = 0; i < chars.length; i++) {//逐个单词再逆序
if (chars[i] != ' ') {//找出单词的左右索引
left = i == 0 || chars[i - 1] == ' ' ? i : left;
right = i == chars.length - 1 || chars[i + 1] == ' ' ? i : right;
}
if (left != -1 && right != -1) {//对单词进行逆序
reverse(chars, left, right);
left = -1;
right = -1;
}
}
}
private static void reverse(char[] chas, int start, int end) {//逆序代码
char temp;
while (start < end) {
temp = chas[start];
chas[start] = chas[end];
chas[end] = temp;
start++;
end--;
}
}
案例3
将字符串 ABCDE 的第[0-2]位移动到[3-end]后面,即:DEABC
1、将ABCDE的[0 1 2]部分的字符串逆序:CBADE
2、将ABCDE的[3 4]部分的字符串逆序:CBAED
3、将整体逆序:DEABC
/**
* 字符串移位
* 1、将ABCDE的[0 1 2]部分的字符串逆序:CBADE
* 2、将ABCDE的[3 4]部分的字符串逆序:CBAED
* 3、将整体逆序:DEABC
*/
public static String stringTranslation(String A, int n, int len) {
// write code here
if (A == null || n == 0) {
return A;
}
char[] s = A.toCharArray();
reverse(s, 0, len - 1);
reverse(s, len, n - 1);
reverse(s, 0, n - 1);
return String.valueOf(s);
}
private static void reverse(char[] chas, int start, int end) {//逆序代码
char temp;
while (start < end) {
temp = chas[start];
chas[start] = chas[end];
chas[end] = temp;
start++;
end--;
}
}
案例4
给定字符串类型的数组 strs ,要求找到一种拼接书序,将数组中所有的字符串进行拼接,保证拼接之后的字符串是字典书序最小
例如: strs = {“abc","de"},可以拼接成 "abcde" 和 "deabc" 但是"abcde"字典书序更小,所以返回"abcde"
对字符串数组进行排序:
如果 str1 + str2 < str2 + str1,则str1放在前面,否则,str2放在前面
//思路:对字符串数组进行排序:
//如果 str1 + str2 < str2 + str1,则str1放在前面,否则,str2放在前面
public static void main(String[] args) {
String[] test = new String[]{"abc","de"};
System.out.println(findSmallest(test, 2));
}
private static String findSmallest(String[] strs, int n) {
// write code here
sortArrs(strs, n);
return toString(strs, n);
}
private static String toString(String[] arrs, int n) {
String res ="";
for (int i = 0; i < n; i++) {
res += arrs[i];
}
return res;
}
private static void sortArrs(String[] arrs, int n) {
for (int i = 0; i < n-1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if ((arrs[j] + arrs[j + 1]).compareTo(arrs[j + 1] + arrs[j]) > 0) {
String temp = arrs[j + 1];
arrs[j + 1] = arrs[j];
arrs[j] = temp;
}
}
}
}
//解法二
public class MyComparator implements Comparator<String> {
@Override
public int compare(String a, String b) {
return (a + b).compareTo(b + a);
}
}
public String findSmallest(String[] strs, int n) {
if (strs == null || n == 0) {
return "";
}
// 根据新的比较方式排序
Arrays.sort(strs, new MyComparator());
String res = "";
for (int i = 0; i < n; i++) {
res += strs[i];
}
return res;
}