1.字符串旋转
2.字符串包含
3.字符串的全排列
4.字符串转换成整数
5.回文判断
6.最长回文子串
1.字符串旋转
给定一个字符串,要求将字符串前面的若干个字符移到字符串的尾部,例如,将字符串"abcdef"的前3个字符'a' 'b' 'c'移到字符串的尾部,那么原字符串将变成"defabc",请写一个函数实现此功能。
首先将字符串 abcdef 分为两部分, abc 与 def,分别对abc逆序和def逆序,得到的结果如下:cbafed,然后对整个字符串逆序,得到的结果如下:defabc,源码如下:
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String string = "abcdefg";
char[] src = string.toCharArray();
instance.leftRotateString(src, src.length, 3);
for(int i=0;i
2.字符串包含
给定一个长字符串a和一字符串b,请问,如何快速地判断出短字符串b中的所有字符串是否都在长字符串a中?
例如,a字符串是"ABCD",b字符串是"BAD",答案是true,因为字符串b中的所有字母都在字符串a中。
解法一:素数相乘
总共26个英文字母,我们可以用前26个素数表示这26个英文字母,因为素数是乘法中一种非常重要的概念。
如果判断b字符串是否是a字符串的子集,只需要判断a字符串代表的素数的乘积是否能整除b字符串代表的素数乘积。
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String A = "ABCDEFG";
char[] a = A.toCharArray();
String B = "FFV";
char[] b = B.toCharArray();
boolean result = instance.StringContains(a,b);
System.out.println("result = " + result);
}
}
class Solution {
public static final int[] p= new int[]{2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101};
public boolean StringContains(char[] a, char[] b) {
int f = 1;
for (int i=0;i
这种做法也是有问题的,因为乘法毕竟是比较耗时的操作,而且很多的素数相乘会导致溢出。
解法二:位运算
26个英文字母,可以看成26个位,如果当前字符存在,则在相应的位置1,a字符串生成一个hash位,然后使用这个hash位于b字符串对应的位相与,可以判断得到结果。
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String A = "ABCDEFG";
char[] a = A.toCharArray();
String B = "FFB";
char[] b = B.toCharArray();
boolean result = instance.StringContains(a,b);
System.out.println("result = " + result);
}
}
class Solution {
public boolean StringContains(char[] a, char[] b) {
int hash = 0;
for(int i=0;i
3.字符串的全排列
输入一个字符串,打印出该字符串中字符串的所有排列,例如,输入字符串"abc",则输出由字符'a' 'b' 'c'所能排列出来的所有字符串"abc" "acb" "bac" "bca" "cab" "cba"
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String string = "abcd";
char[] array = string.toCharArray();
for(int i=0;i=0)&&(array[i]>=array[i+1]);i--);
if(i<0)return false;
// System.out.println("i="+i);
int k;
for(k=length-1;(k>=i)&&(array[k]<=array[i]);k--);
// System.out.println("k="+k);
swap(array,i,k);
reverse(array, i+1,length-1);
return true;
}
public void swap(char[] array, int i, int j) {
char temp = array[i];
array[i]=array[j];
array[j]=temp;
}
public void reverse(char[] array, int start, int end) {
while(start
4.字符串转换成整数
输入一个由数字组成的字符串,请把它转换成整数并输出。例如,输入的字符串"123",输出整数123
5.回文判断
给定一个字符串,如何判断这个字符串是否是回文串,所谓的回文串,就是正反读都是一样的字符串。
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String string = "madam";
char[] src = string.toCharArray();
boolean result = instance.solution(src);
System.out.println("result = " + result);
}
}
class Solution {
public boolean solution(char[] src) {
if (src.length <1) {
return false;
}
int start = 0;
int end = src.length-1;
while(start
延伸拓展:如何判断一个链表是否是一个回文链表。
提示:用一个快慢指针来确定一下链表的中间位置,然后将后半部分链表逆序,和前半部分链表比较判断是否是回文链表。
6.最长回文子串
给定一个字符串,求它的最长回文子串的长度。
解法一:Manacher匹配算法
下面是完整的源码,具体的解法思路是:
//Author:[email protected]
public class StringTest {
public static void main(String[] args) {
Solution instance = new Solution();
String string = "12212321";
String result = instance.solution(string);
System.out.println("result = " + result);
}
}
class Solution {
public String solution(String s) {
String result = "$#";
for(int i=0;i0
&& result.charAt(i+p[i])==result.charAt(i-p[i])) {
p[i]++;
}
if(i+p[i] >mx) {
id=i;
mx=i+p[i];
}
if (p[i]-1>maxLen){
maxLen= p[i]-1;
index=i;
}
}
index=index/2-1;
return s.substring(index-maxLen/2, index+maxLen/2+1);
}
public int min(int a, int b) {
return a > b ? b:a;
}
}