给定一个字符串,请问最多删除一个的情况下,能否组成一个回文字符串。
回文字符串:正着读和反着读是一样的字符串。
数据范围:字符串长度满足 ,字符串中仅包含小写英文字母
class Solution { public: bool palindrome(string str) { bool flag_delete = false; for (int i = 0, j = str.length() - 1; i <= j; i++, j--) { if (str[i] != str[j]) { if (!flag_delete) { if (str[i + 1] == str[j]) { i++; flag_delete = true; } else if (str[i] == str[j - 1]) { j--; flag_delete = true; } else { return false; } } else { return false; } } } return true; } };
package main //import "fmt" /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ func palindrome( str string ) bool { i,j:=0,len(str)-1 for i<j{ if str[i]!=str[j]{ if check(str[i+1:j+1])||check(str[i:j]){ return true } return false } i++ j-- } return true } func check(str string)bool{ i,j:=0,len(str)-1 for i<j{ if str[i]!=str[j]{ return false } i++ j-- } return true }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ bool JudgeChar(string& s, int left, int right) { while(left<right) { if(s[left++]!=s[right--]) { return false; } } return true; } bool palindrome(string str) { // write code here int left=0, right=str.size()-1; while(left<right) { if(str[left]!=str[right]) { return JudgeChar(str, left+1, right)|| JudgeChar(str, left, right-1); } left++; right--; } return true; } };
提供一个删除k个字符思路
function palindrome(str) { function dfs(s, i, j, k) { if (k < 0) return false; if (j - i <= 1) return true; while (i < j) { if (s[i] == s[j]) { i++; j--; } else { return ( dfs(s, i + 1, j, k - 1) || dfs(s, i, j - 1, k - 1) || dfs(s, i + 1, j - 1, k - 2) ); } } return true; } return dfs(str,0,str.length-1,1) }
public class Solution { public boolean palindrome(String str) { // write code here char[] chars = str.toCharArray(); for (int i = 0; i < chars.length; i++) { if (chars[i] != chars[chars.length - 1 - i]) { return false; } continue; } return true; } }
bool palindrome(string str) { // write code here int i=0,j=str.length()-1; for(;str[i]==str[j]&&i<=j;i++,j--){ } if(i>=j)return true; int i1=i+1; int j1=j; for(;str[i1]==str[j1]&&i1<=j1;i1++,j1--){ } if(i1>=j1)return true; int i2=i; int j2=j-1; for(;str[i2]==str[j2]&&i2<=j2;i2++,j2--){ } if(i2>=j2)return true; return false; }
# -*- coding: utf-8 -*- # coding:utf-8 # # 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 # # # @param str string字符串 # @return bool布尔型 # class Solution: """ 题目: https://www.nowcoder.com/practice/130e1a9eb88942239b66e53ec6e53f51?tpId=196&tqId=40502&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title= 算法: 定义check(left, right),用于判断字符串str中以str[i]开始,str[j]的连续字符串是否为回文串 本题允许删除一个字符,这里我们使用deleted表示是否已经删除过。 当str[i] != str[j]时: 若delete = True,返回False 否则:判断check(i, j-1)&nbs***bsp;check(i+1, j) 复杂度: 时间复杂度:O(n) 空间复杂度:O() """ def palindrome(self, str): # write code here def check(left, right): i, j = left, right while i < j: if str[i] == str[j]: i += 1 j -= 1 elif self.deleted: return False else: self.deleted = True return check(i + 1, j)&nbs***bsp;check(i, j - 1) return True left, right, self.deleted = 0, len(str) - 1, False return check(left, right) if __name__ == "__main__": sol = Solution() # s = "nowwon" # s = "nowewon" s = "noweawon" # s = "noowwwn" res = sol.palindrome(s) print res
import java.util.*; public class Solution { boolean flag = false; public boolean palindrome (String str) { int left = 0; int right = str.length()-1; while(left < right) { if(str.charAt(left) == str.charAt(right)) { left ++; right --; }else { if(flag) { //说明已经删过一次了 return false; } flag = true; //需要判断一下,删左边好还是删右边好 return palindrome(str.substring(left,right))|| palindrome(str.substring(left+1,right+1)); } } return true; } }
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param str string字符串 * @return bool布尔型 */ bool palindrome(string str) { if(str.empty()||str.length()==1) return true; bool res; if(isP(str)){ return true; } for(int i=0;i<str.length();i++){ string new_str; new_str=str.substr(0,i)+str.substr(i+1); res=isP(new_str); if(res==false){ return false; } } return true; } bool isP(string s){ string new_str(s.rbegin(),s.rend()); return new_str==s; } };