题目:大家经常玩成语接龙游戏,我们试一试英语的接龙吧:一个文本文件中有N 个不同的英语单词, 我们能否写一个程序,快速找出最长的能首尾相连的英语单词链,每个单词最多只能用一次。最长的定义是:最多单词数量,和单词中字母的数量无关。统一输入文件名称:input1.txt, input2.tx统一输出文件名称:output1.txt,output2.txt。程序需要考虑下列异常状况:例如,文件不存在,你的程序会崩溃么,还是能优雅地退出并给用户提示信息?如果文件没有任何单词、只有一个单词、没有可以首尾相连的单词,程序应该如何输出?如果输入文件有一万个单词,你的程序能多快输出结果?

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
 
public class Max {
public static void main(String[] args)throws IOException {
    Word word=new Word();                                      //单词的链头
    Word lian,xin;                                             
    String str="";
    File f1=new File("D:\\text.txt");      
    if(!f1.exists())
    {
        System.out.println("文件不存在");
    }
    else
        {FileReader f=new FileReader("D:\\text.txt");                //读取英文文件
    
    
    char[] c=new char[1];                                 //每次读取一个字母
    int b=0;
    boolean exist=false;                              //判断单词是否存在于  word 链中
   
    BufferedWriter writer2 = new BufferedWriter(new FileWriter(new File("D:\\result.txt"),true));
 
    
    File writeName=new File("D:\\result.txt");
    String S1="";
    String S2="";
    writeName.createNewFile();
  
    int num1=0;
    int num2=0;
    int[] Num1=new int[1000000];
    int[] Num2=new int[1000000];
    
    
    
    while((b=f.read(c))!=-1)                              //每次读取一个字母直到最后
    {
        int i1=1;
        //如果字符为  换行、空格、单引号、双引号、逗号、句号  则为一个单词的结束及另一个单词的开始
        if(String.valueOf(c).equals("\r")||String.valueOf(c).equals("\n")||String.valueOf(c).equals(" ")||String.valueOf(c).equals(",")||String.valueOf(c).equals(".")||String.valueOf(c).equals("\"")||String.valueOf(c).equals("'"))
        {
            lian=word;
            while(lian!=null)            
            {
                if(lian.value.equalsIgnoreCase(str))           //如果单词在单词链中存在,则单词个数++
                {
                    lian.geshu++;exist=true;break;
                }
                else
                {
                    if(i1==1)
                    {
                        
                    
                    Num1[num1]=num1;
                    
                    String ss=str.substring(0, 1);
                    
                    S1=S1+ss;
                    num1=num1+1;
                    }
                    
                    if(i1==1)
                    {
                        Num2[num2]=num2;
                        String ss=str.substring(str.length()-1, str.length());
                        
                        S2=S2+ss;
                        num2=num2+1;
                    }
                    
                    
                    i1=i1+1;
                    lian=lian.next;
                }
            }
            if(exist==false)                        //如果不存在,则在单词链中添加
            {
                xin=new Word(str,1);
                xin.next=word.next;
                word.next=xin;
                str="";
            }
            else
            {
                exist=false;
                str="";
            }
        }
        else                                      //单词
        {
            str+=String.valueOf(c);
        }
        
    }
    
    if(num1==1)
    {
        System.out.println("只有一个单词");
    }
    else {
    
        if(num1==0)
        {
            System.out.println("没有单词");
        }
        
        
        else {
        
        
    System.out.println(S1);
    System.out.println(S2);
    
    System.out.println(num1);
    for(int im=0;im<num1;im++)
    {
        String s1=S1.substring(im, im+1);
        int ii=1;
        for(int in=0;in<num1;in++)
        {
            
            String s2=S2.substring(in, in+1);
            
            int n1=Num1[im];
            int n2=Num2[im];
            
            if(!s1.equals(s2))
            {
                System.out.println("没有首尾相连单词");
            }
                
                
            if(s1.equals(s2))
            {
                
                
                
                
                int N=20;
                for(int i=1;i<=10;i++)                   
                {
                    xin=new Word("",0);
                    lian=word.next;
                    //找到单词链中个数最多的
                    while(lian!=null)
                    {
                        
                            xin=lian;
                        
                        lian=lian.next;
                    }
                    int m=n1-1;
                    if(i==n1-1)
                    {
                        
                         System.out.println("第"+i+"个 :"+xin.value+"个数:"+xin.geshu);
                    
                         try  {
                             
                             BufferedWriter writer = new BufferedWriter(new FileWriter(new File("D:\\result.txt"),true));
                             writer.write("\n"+xin.value);
                             writer.close();
 
                                
                            }
                         catch (IOException e) {
                            e.printStackTrace();
                        }
            
                    
                    }
                    lian=word;
                    //删除单词链中单词个数最多的
                    while(lian.next!=null)
                    {
                        if(lian.next.value.equalsIgnoreCase(xin.value))
                        {
                            lian.next=lian.next.next;
                            break;
                        }
                        lian=lian.next;
                    }
                }
                
            }
        }
        
        ii=ii+1;
        
        
    }
    
           }
    }
    
        }
}
}

建立两个字符串数组,一个放每一个单词的首字母,另一个放每一个单词的尾字母;

然后根据这两个是否相同,放进一个int数组中。

 

posted on 2019-06-09 19:53  雨过山  阅读(126)  评论(0编辑  收藏  举报