680 Valid Palindrome II

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome. Example 1: Input: "aba" Output: True Example 2: Input: "abca" Output: True Explanation: You could delete the character 'c'.

这题是'Easy',但是值得一做。我一开始审题不清,没注意at most这个词,以为必须要删掉一个了,结果写了个O(m*n)的做法,把每个字母都去掉一遍,然后reverse,看跟原串是否一致。 后来我有个一个思路,第一次遇到不一致的,就跳过,左边跳还是右边跳要判断一下,但是没法AC,感觉这做法确实有问题。

最后我又有了个思路: 遇到不一致的,直接把响应的两个都char都去掉,reverse一下(其实不需要reverse..首位对比就行),如果有一个等于原串,就return true。AC了。

	public boolean validPalindrome(String s) {
		if (s == null) return true;
		boolean firstTime = true;
		int start = 0, end = s.length() - 1;
		while (start < end) {
			if (s.charAt(start) != s.charAt(end)) {
				String t1 = s.substring(0, start) + s.substring(start + 1);
				String t2 = s.substring(0, end) + s.substring(end + 1);
				if (reverse(t1).equals(t1) || reverse(t2).equals(t2)) {
					return true;
				} else
					return false;
			}
			start++;
			end--;
		}
		return true;
	}

	private String reverse(String s) {
		StringBuilder sb = new StringBuilder(s.length());
		int end = s.length() - 1;
		for (int i = end; i >= 0; i--) {
			sb.append(s.charAt(i));
		}
		return sb.toString();
	}
复制代码

别人的写法:

public boolean validPalindrome(String s) {
    int l = -1, r = s.length();
    while (++l < --r) 
        if (s.charAt(l) != s.charAt(r)) 
       //这写法挺贼的
        return isPalindromic(s, l, r+1) || isPalindromic(s, l-1, r);
    return true;
}
public boolean isPalindromic(String s, int l, int r) {
    while (++l < --r) 
        if (s.charAt(l) != s.charAt(r)) return false;
    return true;
}
复制代码

转载于:https://juejin.im/post/5a3134166fb9a044fb07c300

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值