字符串

str.charAt(int index)

int compareTo(Object o)
String concat(String str)
boolean endsWith(String suffix)
boolean equals(Object anObject)
int indexOf(int ch)
int indexOf(String str)
int length()
String substring(int beginIndex, int endIndex)
char[] toCharArray()
String trim()
str.trim(); //去掉首尾空格
str.replace(" “,”"); //去除所有空格,包括首尾、中间

StringBuffer sBuffer = new StringBuffer(“菜鸟教程官网:”);
sBuffer.append(“www”);
sBuffer.append(".runoob");
sBuffer.append(".com");
sBuffer.reverse()
sBuffer.delete(int start, int end)
sBuffer.insert(int offset, int i)
sBuffer.toString()

System.out.println(sBuffer);

题目描述:最长回文子串(Longest Palindromic Substring)


给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"


/**
 * 思想:循环遍历字符串,以每一个字符为中心,向两边扩散寻找回文串,也就是判断两侧字符是否相等
 * 由于回文字符串的长度可奇可偶,如'bob'奇数,正中间为单个字符,'noon'为偶数,正中间为两个相同的字符
 * 所以搜索方式要分奇偶,奇数情况,就以当前遍历的字符为中心,向两边扩散
 * 偶数情况,以当前字符及其下一个位置的字符当做偶数回文最中间的两个字符,向两边扩散
 * @author heimu
 * 
 */
public class test {
	public static String longestPalindrome(String s) {
		//如果长度小于2,证明是单个字符,直接返回
        if (s.length() < 2) return s;
        int n = s.length();
        //原C++代码使用了引用,这里使用数组实现引用的功能,也就是形参可以改变实参的内容
        int [] maxLen = {0};
        int [] start = {0};
        //循环字符串,以每一个字符为中心,向两边扩散来寻找
        for (int i = 0; i < n - 1; ++i) {
            searchPalindrome(s, i, i, start, maxLen);
            searchPalindrome(s, i, i + 1, start, maxLen);
        }
        //这个地方与原C++代码的返回不一样,特修改如下,经过测试,完全正确。
        return s.substring(start[0], start[0]+maxLen[0]);
    }
	
    static void searchPalindrome(String s, int left, int right, int [] start, int[] maxLen) {
    	//如果左右侧没有超越边界
    	//同时如果左侧字符等于右侧字符,那么直接向两边扩散,直到左右边界值不等,左边界左移,右边界右移
        while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) {
            --left; ++right;
        }
        if (maxLen[0] < right - left - 1) {
            //更新起始位置
        	start[0] = left + 1;
        	//更新找到的回文字符串的长度
        	//我觉得正常情况下,长度=右-左+1,但是注意的是上面的循环已经左边界左移,右边界右移,已经增大了两个长度
        	//所以本质上是长度=右-左-2+1
            maxLen[0] = right - left - 1;
        }
    }

	public static void main(String[] args) {
		String result = longestPalindrome("babad");
		System.out.println(result);
	}

}


/**
 * 思想:不使用子函数,直接遍历一遍字符串,已每一个字符为中心向两侧扩散;
 * 首先判断剩余的字符数是否小于等于maxlen的一半,是的话说明当前maxlen已经是最大值了;
 * 要注意的是,需要向右遍历跳过重复项;
 * @author heimu
 * 
 */
public class test {
	public static String longestPalindrome(String s) {
		//如果长度小于2,直接返回
		if (s.length() < 2) return s;
		//初始化
		int n = s.length(), maxLen = 0, start = 0;
		//比那里字符串
		for (int i = 0; i < n;) {
			//如果剩余的字符数小于等于maxlen的一半,说明maxlen无法变成了
			//注意i代表着当前遍历的字符,也就意味着是当前搜索到的maxlen回文字符串的中心
			//也就意味着i左右两侧各有maxlen/2个字符。(注意奇偶,这里不分开了)
			//如果右侧剩余的字符n-i小于等于maxlen/2,也就意味着我们的最大回文字符串查找结束了
			//也就是i后面的人任意一个字符,以此为中心,向两侧扩散得到的回文串的长度都不可能超过maxlen
		    if (n - i <= maxLen / 2) break;
		    int left = i, right = i;
		    //向右遍历跳过重复项,这种情况主要针对偶数情况
		    while (right < n - 1 && s.charAt(right + 1) == s.charAt(right)) ++right;
		    //更新i
		    i = right + 1;
		    //如果当前字符的左侧字符与右侧字符相等,向两边扩散
		    while (right < n - 1 && left > 0 && s.charAt(right + 1) == s.charAt(left - 1)) {
		        ++right; --left;
		    }
		    //注意,这个地方由于上述判断的是right+1与left+1字符是否相等,所以这个地方的right与left就是真实的回文串的左右边界
		    if (maxLen < right - left + 1) {
		        maxLen = right - left + 1;
		        start = left;
		    }
		}
		return s.substring(start, start+maxLen);
	}

	public static void main(String[] args) {
		String result = longestPalindrome("cbbd");
		System.out.println(result);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值