poj 1750 java
这道题很坑爹,稍微不注意不是PE就是RA要么TLE。
先说下题意:
题干描述的不是很清晰,主要是通过题目给的例子自己总结的,(这个很关键,没找着好的规律永远会TLE):
规律:后面一个字符串和前面一个字符串比较,如果前几位相同的字符数量大于空格的数量,那么空格的数量加1,如果前几位相同字符数量小于空格的数量,那么空格数量变为相同字符的数量。
网上用java实现的代码基本没找着,没办法,之前poj上一共就4位前辈用java Ac的,只能自己动手了,
开始我直接暴力比较直接打印,最后把RA解决了,但是很遗憾TLE了,
这道题用C,C++都要500Ms+,用java还是有点难度的,
我优化了半天,费尽了脑汁,终于AC了:
下面代码与懒人共享:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { public static StringBuffer[]b=new StringBuffer[11]; public static int blank; public static void main(String[]args) throws IOException{ BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str="" ; String next; blank=0; init(); while((next = in.readLine())!=null){ Write(str,next); str = next; } } public static void Write(String str,String next){ int same = gsn(str,next); if(same>blank){ blank++; }else if(same<blank){ blank=same; } System.out.println(b[blank]+next); } public static int gsn(String s1,String s2){//getSameNumber int len = s1.length()>s2.length()?s2.length():s1.length(); int i; for(i=0;i<len;i++){ if(s1.charAt(i)!=s2.charAt(i)){ break; } } return i; } public static void init(){ StringBuffer sb ; for(int i=0;i<11;i++){ sb = new StringBuffer(""); for(int j=0;j<i;j++){ sb.append(" "); } b[i]=sb; } } }
补充一下,那个空格的打印很浪费时间,java中貌似没有直接打印几个空格的方法,如果每次都用for实现,那么肯定TLE, 由于字符串长度不大于10,所以我用了打表,这个能节约不少时间。