今天没事看看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);
}
}
}