第五届在线编程大赛月赛指定题目:反向互补子串。测试版

今天没事看看csdn发现了这个比赛题目,就写了一版,测试几个字符串输出正常,最后拿了一个长串(length=4980)试了试也输出正常,但是提交csdn就提示挑战失败(你的程序在规定的时间内没能输出数据)。等有时间了再看看那里除了问题吧。


test: 

{GRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRASDGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRTFEWDASQPONQPONABCDEEABECDGRGRASD}

java:
package com.nel.hero;

import java.util.ArrayList;
import java.util.List;

public class InvertedAZ {
	
	public static char[] jsData;
	private static int maxLen = 0;
	public static String left = "";
	public static String right = "";
	public static String _left = "";
	public static String _right = "";
	private static int _maxLen = 0;
	private static int first = 0;
	
	public static void main(String[] args) {

		String data[] = args[0].split("\n");
		for(String a : data){
			compute(a);
		}
	}
	
	public static void compute(String dataStr){
		jsData = dataStr.toCharArray();
		
		for(int i=0; i<jsData.length; i++){
			
			try{
				compare(jsData[i], i);
			}catch(Exception e){
				
			}
		}
//		print(_maxLen, _left, _right);
		System.out.println(_maxLen);
	}
	
	public static void compare(char cur, int pre){
		
		List<Integer> pos =  new ArrayList<Integer>();
		char cur13 = (char) (cur > 'M' ? cur - 13 : cur +13);
		int tail;
		for(int i=jsData.length-1; i>=0; i--){
			if(jsData[i] == cur13){
				left += cur;
				right += jsData[i];
				maxLen = maxLen > 1 ? maxLen : 1;
				pos.add(i);
				if(i <= pre || i < 1) return;
				tail = i - 1;
				try{
					compare1(pre + 1, tail);
				}catch(Exception e){
					
				}
				
			}
			//this loop end, update all status.
			if(maxLen > _maxLen){
				_maxLen = maxLen;
				_left = left;
				_right = right;
			}
			//reset
			maxLen = 0;
			left = "";
			right = "";
		}
	}

	public static void compare1(int pre, int tail){
		if(pre >= tail) return;
		if(Math.abs(jsData[pre] - jsData[tail]) == 13){
			maxLen ++;
			left += jsData[pre];
			right += jsData[tail];
			compare1(pre +1, tail -1);
		} else if(first < 2 && Math.abs(jsData[pre] - jsData[tail -1]) == 13){
			first += 1;
			maxLen ++;
			left += jsData[pre];
			right += jsData[tail -1];
			compare1(pre +1, tail -2);
		} else if(first < 1 && Math.abs(jsData[pre] - jsData[tail -2]) == 13){
			first += 2;
			maxLen ++;
			left += jsData[pre];
			right += jsData[tail -2];
			compare1(pre +1, tail -3);
		} else if(first < 2 && Math.abs(jsData[pre + 1] - jsData[tail]) == 13){
			first += 1;
			maxLen ++;
			left += jsData[pre + 1];
			right += jsData[tail];
			compare1(pre +2, tail -1);
		} else if(first < 1 && Math.abs(jsData[pre + 2] - jsData[tail]) == 13){
			first += 2;
			maxLen ++;
			left += jsData[pre + 2];
			right += jsData[tail];
			compare1(pre +3, tail -1);
		}
		
	}
	
}











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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值