字符串的排列
题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
import
java.util.ArrayList;
public
class
Solution {
public
ArrayList<String> Permutation(String str) {
ArrayList<String> result =
new
ArrayList<String>();
if
(str==
null
||str.length()==
0
){
return
result;
}
int
len=str.length()-
1
;
int
i,j;
char
temp;
char
[] strChar=str.toCharArray();
countSort(strChar);//Arrays.sort(strChar);
char
[] maxStr=
new
char
[len+
1
];
for
(i=
0
;i<=len;i++){
maxStr[i]=strChar[len-i];
}
while
(!String.valueOf(strChar).endsWith(String.valueOf(maxStr))){
result.add(String.valueOf(strChar));
i=len;
while
(strChar[i]<=strChar[i-
1
]){
i--;
}
for
(j=len;j>=i;j--){
if
(strChar[j]>strChar[i-
1
]){
temp=strChar[i-
1
];
strChar[i-
1
]=strChar[j];
strChar[j]=temp;
break
;
}
}
for
(
int
k=i;k<=(len+i)/
2
;k++){
temp=strChar[k];
strChar[k]=strChar[len+i-k];
strChar[len+i-k]=temp;
}
}
result.add(String.valueOf(strChar));
return
result;
}
private
void
countSort(
char
[] strChar) {
int
len=strChar.length;
int
[] count=
new
int
[
58
];
int
j=
0
;
for
(
int
i=
0
;i<len;i++){
count[strChar[i]-
65
]++;
}
for
(
int
i=
0
;i<
58
;i++){
while
(count[i]--!=
0
){
strChar[j++]=(
char
) (i+
65
);
}
}
}
}
字符串的旋转
对于一个字符串,和字符串中的某一位置,请设计一个算法,将包括i位置在内的左侧部分移动到右边,将右侧部分移动到左边。
给定字符串A和它的长度n以及特定位置p,请返回旋转后的结果。
测试样例:
"ABCDEFGH",8,4
返回:"FGHABCDE"
import
java.util.*;
public
class
StringRotation {
public
String rotateString(String A,
int
n,
int
p) {
if
(A==
null
||n<=
1
||n-
1
<=p)
return
A;
char
[] temp=A.toCharArray();
reverse(temp,
0
,p);
reverse(temp,p+
1
,n-
1
);
reverse(temp,
0
,n-
1
);
return
String.valueOf(temp);
}
public
void
reverse(
char
[] temp,
int
start,
int
end){
while
(start<end){
char
t;
t=temp[start];
temp[start++]=temp[end];
temp[end--]=t;
}
}
}