Java高级之String的四道常见算法题

1.模拟一个trim方法,去除字符串两端的空格。
package com.string.exer;

public class StringDemo3 {
	
	// 模拟String类的trim方法
	public static String trim(String str) {
		if(str != null) {
			int start = 0; // 记录非空格的第一个元素
			int end = str.length() - 1; // 记录非空格的最后一个元素
			
			// 查找第一个非空格元素
			while(start < end && str.charAt(start) == ' ') {
				start++;
			}
			// 查找最后一个非空格元素
			while(start < end && str.charAt(end) == ' ') {
				end--;
			}
			/**
			 * 上面写判断条件没有涵盖start==end,如果start和end相等的位置依然是' ',则可以返回null
			 * 如果你上面考虑了相等,下面你就要判断start是否大于end,防止下标越界
			 */
			if(str.charAt(start) == ' ') {
				return null;
			}
			
			return str.substring(start, end + 1);
		}
		return null;
	}
	
	public static void main(String[] args) {
		String s1 = "   hell o   ";
		System.out.println(trim(s1));
		
	}
}

2.将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
package com.string.exer;

public class StringTest4 {

	/**
	 * 将一个字符串的指定部分进行反转
	 * 
	 * @return 返回反转后的字符串
	 */
	// 方法一
	public static String reverse(String str, int startIndex, int endIndex) {
		if (str != null) {
			char[] c = str.toCharArray();
			for (int i = startIndex, j = endIndex; i < j; i++, j--) {
				char temp = c[i];
				c[i] = c[j];
				c[j] = temp;  
			}
			return new String(c);
		}
		return null;
	}
	
	// 方法二
	public static String reverse2(String str, int startIndex, int endIndex) {
		if(str != null) {
			StringBuilder sb = new StringBuilder(str.length());
			// 获取第一段
			sb.append(str.substring(0, startIndex));
			// 获取第二段
			for(int i = endIndex; i > startIndex - 1; i--) {
				sb.append(str.charAt(i));
			}
			// 获取第三段
			sb.append(str.substring(endIndex + 1));
			
			return sb.toString();
		}
		return null;
	}

	public static void main(String[] args) {
		String s = "abcdefg";
		String res = reverse2(s, 2, 5);
		System.out.println(res);
	}
}

3.获取一个字符串在另一个字符串中出现的次数。比如:获取“ ab”在“abkkcadkabkebfkabkskab” 中出现的次数
package com.string.exer;

public class StringDemo1 {

	/**
	 * 获取子字符串在主字符串中出现的次数
	 *   
	 * @param
	 */
	public static int getCount(String mainStr, String subStr) {
		if (mainStr.length() > subStr.length()) {
			int loc = 0;
			int count = 0;
			int startIndex = 0;
			while ((loc = mainStr.indexOf(subStr, startIndex)) != -1) {
				startIndex += loc + subStr.length();
				count++;
			}
			return count;
		}
		return 0;
	}

	public static void main(String[] args) {
		String s = "abkkcadkadkebfkaabkskab"; 
		int res = getCount(s, "ab");
		System.out.println(res);
	}
}

4.获取两个字符串中最大相同子串。比如:str1 = "abcwerthelloyuiodef“;str2 = "cvhellobnm"提示:将短的那个串进行长度依次递减的子串与较长的串比较。
package com.string.exer;

import java.util.Arrays;

public class StringDemo2 {
	
	/**
	 * 获取两个字符串的最大的子串
	 * @param str1 字符串一
	 * @param str2 字符串二
	 * @return 返回最大子串, 只返回一个
	 */
	public static String getMaxSameStr(String str1, String str2) {
		// 获取两个字符串中的最大字符串和最小字符串
		String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
		String minStr = (str1.length() < str2.length()) ? str1 : str2; 
		// 计算出最小字符串的长度
		int length = minStr.length();
		/**
		 * 以短的字符串去比较长的字符串,看长字符串中是否包含当前字符串的某个子串。
		 * 先用自身去比较,然后每次以长度减一的子串去比较,即是每次从后面扣去一个元素
		 */
		for(int i = 0; i < length; i++) {
			// 判断短字符串当前长度的所有子串是否能匹配到
			for(int x = 0, y = length - i; y <= length; x++, y++) {
				// 获取每次比较的字符串
				String temp = minStr.substring(x, y);
				// 判断当前子串是否在最大字符串中
				if(maxStr.contains(temp)) {
					return temp;
				}
			}
		}
		return null;
	}
	
	// 扩展,可以得到所有最大相同子串
	public static String[] getMaxSameStrArr(String str1, String str2) {
		String maxStr = (str1.length() >= str2.length()) ? str1 : str2;
		String minStr = (str1.length() < str2.length()) ? str1 : str2;
		int length = minStr.length();
		// 定义一个字符串容器
		StringBuilder sb = new StringBuilder();
		for(int i = 0; i < length; i++) {
			for(int x = 0, y = length - i; y <= length; x++, y++) {
				String tempStr = minStr.substring(x, y);
				if(maxStr.contains(tempStr)) {
					sb.append(tempStr + ",");
				}
			}
			// 此时最大的子串已经完全拿到了,不必再往下找了
			if(sb.length() != 0) {
				break;
			} 
		}
		String[] strArr = sb.toString().split(",");
		return strArr;
	}
	
	public static void main(String[] args) {
//		String str1 = "abcwerthelloyuiodef";
//		String str2 = "cvhellobnm";
//		String res = getMaxSameStr(str1, str2);
//		System.out.println(res);

		String str1 = "abcwerthelloyuioabdef";
		String str2 = "cvhellobnmabdef";
		String[] res = getMaxSameStrArr(str1, str2);
		System.out.println(Arrays.toString(res));
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值