整理昨天的筆記,做了幾個字符串的問題,感覺還不錯,
package com.an.test.teststring;
import org.junit.Test;
public class TestString {
//1、模擬一個trim方法,去除字符串兩端的空格。
@Test
public void test() {
//方法一
// String str1 = " 我愛Java ";
// char[] str2 = str1.toCharArray();
// int start = 0;
// int end = str2.length-1;
// for(int i=0;i<str2.length;i++){
// if(str2[i] == ' '){
// start++;
// }else{
// break;
// }
// }
//
// for(int i=end;i>=0;i--){
// if(str2[i] == ' '){
// end--;
// }else{
// break;
// }
// }
// String str3 = str1.substring(start,end+1);
// System.out.println(str3);
//方法二:
String str4 = " 我愛Java ";
while(str4.startsWith(" ")){
str4 = str4.replaceFirst(" ", "");
}
System.out.println("[" + str4 + "]");
while(str4.endsWith(" ")){
str4 = str4.substring(0, str4.length()-1);
}
System.out.println("[" + str4 + "]");
}
//將一個字符串進行反轉。將字符串中指定部分進行反轉。
//比如將“abcdefgho”反轉爲”abfedcgho”
@Test
public void test1(){
String reverse = reverse("abcdefgho",2,6);
System.out.println(reverse);
}
public String reverse(String res,int start,int end){
//把這個字符串分爲3段,左邊 中間的 右邊的。對其中間的進行逆轉
String left = res.substring(0, start);
String right = res.substring(end);
String middle = res.substring(start, end);
char[] char1 = middle.toCharArray();
for(int i=0,j=char1.length-1;i<char1.length/2;i++,j--){
char temp = char1[i];
char1[i] = char1[j];
char1[j] = temp;
}
String str = "";
for(int i=0;i<char1.length;i++){
str = str + char1[i];
}
System.out.println(str);
res = left + str + right;
return res;
}
//3、獲取一個字符串在另一個字符串中出現的次數。
//比如:獲取"ab"在 “abababkkcadkabkebfkabkskab”中出現的次數
@Test
public void test2(){
String str1 = "abababkkcadkabkebfkabkskab";
String str2 = "ab";
int count = count(str1,str2);
System.out.println(count);
}
public int count(String res,String find){
int count = 0;
while(res.contains(find)){
count++;
int index = res.indexOf(find);
res = res.substring(index+find.length());
}
return count;
}
//很想最長公共子串(LCS),但是LCS很難理解的.小菜不懂LCS算法
//獲取兩個字符串中最大相同子串。比如:
//str1 = "abcwerthelloyuiodefm“;str2 = "cvhellobnm"
//提示:將短的那個串進行長度依次遞減的子串與較長的串比較。
@Test
public void test4(){
String maxSub = getMaxSub("abcwerthelloyuiodefm", "cvhellobnm");
long end = System.currentTimeMillis();
System.out.println(maxSub);
}
public static String getMaxSub(String str1 ,String str2){
//1、找出str1和str2誰長誰短,
String max = str1.length() > str2.length() ? str1 : str2;
String min = str1.length() < str2.length() ? str1 : str2;
/*此題思想:外循壞,就是從短的字符串的第一個位置開始,記爲左邊.
* 內循環,就是要截取多少次.截取時,就是從left位置開始截取,外循環一次,left往前動一位.
* 內循環就是要從left位置開始截取,截取到倒數第一個、第二個、.....第left個
*
*
*
*/
String result = "";
int count = 0;
for(int left = 0; left <min.length(); left++){
//left = 0,9
for(int right = 0; right < min.length()-left; right++){
//left = 0, right = 0,1,..9 第一輪,內循環循環10
//left = 1, right =0 ,8 第二輪,內循環執行
//...
String str = min.substring(left,min.length()-right);
if(max.contains(str)){
//System.out.println("str:"+str);
//System.out.println("result:"+result);
if(str.length() >= result.length()){
//System.out.println("str111:"+str);
result = str;
count++;
}
}
}
}
System.out.println(count);
return result;
}
}