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,所以我用了打表,这个能节约不少时间。

posted on 2014-08-31 09:46  asonga  阅读(363)  评论(0编辑  收藏  举报

导航