leetcode之Longest Palindromic Substring

思路:

1、把原来的字符串转换成字符数组,再创建一个原来字符数组的转置数组

2、让转置数组和原来的字符数组相向而行,每移动一个单位,比较一次,总共比较2*length-1次,令i的初始值为1,i记录比较次数;当i<=length的时候,比较的长度是i,当i>=length的时候,比较的长度是2*length-i;

3、比较方式:两个字符数组对应的位置进行比较,选出连续重合最多的加入list里面,最后总选出连续重合总数最多的list,把它复制给resultlist。

犯的错误:

1、逻辑错误:比较的方式不对(第一次采用逐个比较,这样的结果是狭窄了范围,没有考虑其他更多的情况;第二次是只比较每次重合以后第一个连续重合的串,忽视了每次比较时,同时存在几个连续重合的串的情况)

2、题意理解的错误:注意回文串的一个重要特点是,这个串它是对称的。

3、语法理解错误:(1)有的串是因为后一个字母不同而结束,有的串是因为没有后一个字母而结束,这两种情况是不一样的。

(2)赋值以后,因为result和cls指向的是同一个对象,所以cls如果clear,那么result也没了。

特别注意的:

    用flag来标识串结束的位置(在因后一个字母不同而结束的情况),以方便进行接下来的操作。

public static String longestPalindrome(String s) {
		
		char[] strarr=s.toCharArray();
		char[] reversearr=new char[strarr.length];
			
		for(int i=0;i<strarr.length;i++) {
			reversearr[i]=strarr[strarr.length-1-i];
		}
			
		List<Character> resultls=new ArrayList<Character>();
		int rslength=0;
		
		for(int i=1;i<2*strarr.length;i++) {
			
			boolean flag=false;
			List<Character> cls=new ArrayList<Character>();
			if(i<=strarr.length) {
				char current=strarr[0];
				int k=0;
				int comparelength=i;
				for(int j=0;j<comparelength;j++) {
					current=strarr[k];
					char comparechar=reversearr[reversearr.length+j-i];
					if(current==comparechar) {
						cls.add(current);
						flag=true;
						k++;
					}else {
						if(flag) {
							if(cls.size()>=rslength&&checkSymmetric(cls)) {
								rslength=cls.size();
								resultls=cls;
							}
								cls=new ArrayList<Character>();
							
						}
						k++;
					}
					
					
				}
				if(cls.size()>=rslength&&checkSymmetric(cls)) {
					rslength=cls.size();
					resultls=cls;
				}
				
			}
			else {
				char current=strarr[i-strarr.length];
				int comparelength=2*strarr.length-i;
				int k=0;
				
				for(int j=0;j<comparelength;j++) {
					char comparechar=reversearr[k];
					current=strarr[i+j-strarr.length];
					if(current==comparechar) {
						cls.add(current);
						flag=true;
						k++;
					}else {
						if(flag) {
							if(cls.size()>=rslength&&checkSymmetric(cls)) {
								rslength=cls.size();
								resultls=cls;
							}
							cls=new ArrayList<Character>();
							
						}
						k++;
					}
				}
				if((cls.size()>=rslength)&&checkSymmetric(cls)) {
					rslength=cls.size();
					resultls=cls;
				}
				
				
			}
				
		}
		
		String ss="";
		for(int i=0;i<resultls.size();i++) {
			ss=ss+resultls.get(i).toString();
		}
		return ss;
        
    }
	public static boolean checkSymmetric(List<Character> ls) {
		
		int length=ls.size();
		for(int i=0;i<length/2;i++) {
			char char1=ls.get(i);
			char char2=ls.get(length-i-1);
			if(char1!=char2)
				return false;
		}
		return true;
		
	}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值