關於字符串的運用(去除空格,反轉,統計次數,最長公共子串)

整理昨天的筆記,做了幾個字符串的問題,感覺還不錯,

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;
	}
    

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章