在一个字符串中寻找到最长重复子串(1)

来源:互联网 发布:手机录像软件 编辑:程序博客网 时间:2024/05/17 23:09

本题应该从超过100w的字符串中寻找,但是本算法执行到1000时就比较慢了。时间空间复杂度不好,可以很方便的计算出来。如果您有好的方法可以分享一下


其中包含:随进输出字符串,文件读取


算法描述:母串有n个字符,最大的子串最多有n/2,所以:

1、把母串分为长度相等的两部分,进行比较

2、长度减1,在进行比较

3、假设已经比较过m次,剩下的字符串为n-m,为k。先取母串的前k个字符,与k+1到2K之间的字符串进行比较,再与k+2到2k+1比较,一直到n-k到n。然后第一个串后移一位,重复上述过程。



package mainpackage;


import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Random;

public class A {

    static public void main(String args[]) {
         //String s = new String("xouahbglcemdohpcfllcdjvmsrohyjfogbqbgwgtibuzchhmlztfnakhykryoeczgjdufmvuljlcslmvirulltqzydgctvqeddlf");
        //String ss = new String("sabcwabcb");rylxhbdmydhdtlzupzxphhhgwgiu

        //String s = "xasccascv";
        // System.out.println(s);
        
        //产生随机的字符串
        String base = "abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        StringBuffer str = new StringBuffer();
        String ss = new String();
        StringBuffer s = new StringBuffer();
        int length = 300;
        for(int i = 0;i < length; i++)
        {
            int number = random.nextInt(base.length());
            str.append(base.charAt(number));
        }
        ss = str.toString();
        System.out.println(ss);//测试输出字符串
        
        //创建文件
        File file = new File("f.txt");
        if(!file.exists())
        {
            try
            {
                file.createNewFile();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }
        }
        
        //把字符串写入到文件
        //System.out.println(ss);
        try
        {
            FileWriter fw = new FileWriter("f.txt");
            fw.write(ss);
            fw.close();
        }
        catch (IOException ioe)
        {
            ioe.printStackTrace();
        }
        
        //从文件中读取
        try(FileReader fr = new FileReader("f.txt"))
        {
            char [] cbuf = new char[length];
            //int hasRead = 0;
            /*while((hasRead = fr.read(cbuf))>0)
            {
                s.append(cbuf);
            }*/
            fr.read(cbuf);
            s.append(cbuf);
            fr.close();
        }
        catch (IOException ex)
        {
            ex.printStackTrace();
        }
        //System.out.println(s);
        
        int string_length;
        string_length = s.length();
        //System.out.println(string_length);

        int out = 0  ;
        for (int i = string_length / 2; i >= 1; i--)// 从字符串长度的一半开始
        {
            if(out != 0)
            {
                break;
            }
            //System.out.println(i);
            String child_string1 = null;
            String child_string2 = null;
            for(int k = 0; k <= (string_length - i*2); k++)
            {
                if(out != 0)
                {
                    break;
                }
                for (int j = 0; j <= (string_length - i*2); j++)
                {
                    if(out != 0)
                    {
                        break;
                    }
                    if ((i * 2 + k + j) <= string_length)
                    {
                        child_string1 = s.substring(k, k + i);
                        //System.out.println(child_string1);
                        child_string2 = s.substring(k + i + j, k + i*2 + j);
                        //System.out.println(k + i*2 + j);
                        if (child_string1.equals(child_string2))
                        {
                            System.out.println("最大子串的长度为:" + child_string1.length()
                                    + ";子串为:" + child_string1);
                            out = 1;
                        }
                    }
                    else
                    {
                        j = string_length - i*2;//结束j的循环,所以赋值为string_length - i*2
                    }

                    if (out != 0) // 结束for循环
                    {
                        j = string_length - i*2 + 1;
                        k = string_length - i*2 + 1;
                        i = 0;    
                    }
                }
            }
        }
        //System.out.println(string_length);
    }

}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 ps没有足够的ram怎么办 ps性能调不了是怎么办 苹果6p照相模糊怎么办 相框玻璃碎了怎么办 word文档加密后忘记密码怎么办 手机wps密码忘了怎么办 苹果手表忘了密码怎么办 苹果系统忘了密码怎么办 ps画板建小了怎么办 wps表格密码忘了怎么办 word文档变成虚的怎么办 wps论文中表格跨页怎么办 word文档复制过来有边框怎么办 wps表格跨页断开怎么办 锅的铆钉老是松怎么办 文胸不知道怎么染色了怎么办 未后的信息我该怎么办? 做leep手术后大出血怎么办 眼线笔出不了水怎么办 手机字体变成空心字怎么办 平安树树枝黑了怎么办 柳树被虫钻洞了怎么办 柳树叶子上有虫子怎么办 小金鱼翻肚皮了怎么办 秋天树叶没了小鸟怎么办 去国外旅游不会英语怎么办 橡皮树长了2米高怎么办 榕树盆景长的高怎么办? 2岁宝宝看书弯腰低头怎么办 excel表格打开很慢怎么办 3d模型有红线框怎么办 电视页面加载时错误怎么办 投屏显示加载视频错误怎么办 word遇到问题需要关闭怎么办 画眼线看不出来怎么办 14岁眼皮很松怎么办啊 ps存不了psd格式怎么办 花草上有白色物怎么办 ps抠出来有白边头发怎么办 脸上结痂掉了有红印怎么办 海棠花瓣干枯怎么办茎变软