死磕字符串相关算法

164 阅读1分钟

这位大哥总结得不错: juejin.cn/post/684490…

我自己刷的 :

1.最长回文串 中心扩散法:

  public String getLongestPalindrome(String s) {
	if (s == null || s.length() < 1) {
		return s;
	}

	int maxStart = 0;
	int maxEnd = 0;
	for (int i = 0; i < s.length(); i ++) {
	    //主要理解回文串中字符为单数和双数的情况
		int len1 = getLongestByCenter(s, i ,i);
		int len2 = getLongestByCenter(s, i, i + 1);
		int len = Math.max(len1, len2);
		if (len > maxEnd - maxEnd) {
			maxEnd = i + len/2;
			maxStart = i - (len - 1)/2;
		}
	}
	return s.substring(maxStart, maxEnd + 1);


}

//从中心向两边扩散真正寻找回文串
public int getLongestByCenter(String s, int left, int right) {
	while (left > 0 && right < s.length()
			&& s.charAt(left) == s.charAt(right)) {
		left --;
		right ++;
	}
	return right - left - 1;
}

2.kmp找A串中的第一个B串

//暂时还没理解到位

3.字符串的最长无重复字符子串

public int getLongestSubString(String s) {
	int len = s.length();
	int res = 0;

	//key为字符,value为下标
	Map<Character, Integer> map = new HashMap();

	//i和j作为窗口的两个指针,map来存储窗口中的字符
	for (int start = 0, j = 0; j < len; j++) {

		if (map.containsKey(s.charAt(j))) {
			//abba有可能start比map.get(s.charAt(j))大,i是不可能后退的
			start = Math.max(map.get(s.charAt(j)), start);
		}
		res = Math.max(res, j - start + 1);
		map.put(s.charAt(j), j + 1);
	}
	return res;
}

4.n对括号的所有合法可能https://leetcode-cn.com/problems/bracket-lcci/

5.Z 字形变换https://leetcode-cn.com/problems/zigzag-conversion/

6.求字符串数组的最长公共前缀

public String longestCommonPrefix(String[] strs) {
	if (strs == null || strs.length == 0) return "";
	return longestCommonPrefix(strs, 0 , strs.length - 1);
}

private String longestCommonPrefix(String[] strs, int l, int r) {
	if (l == r) {
		return strs[l];
	}
	else {
		int mid = (l + r)/2;
		String lcpLeft =   longestCommonPrefix(strs, l , mid);
		String lcpRight =  longestCommonPrefix(strs, mid + 1,r);
		return commonPrefix(lcpLeft, lcpRight);
	}
}


private String commonPrefix(String left,String right) {
	int min = Math.min(left.length(), right.length());
	for (int i = 0; i < min; i++) {
		if ( left.charAt(i) != right.charAt(i) )
			return left.substring(0, i);
	}
	return left.substring(0, min);
}