论坛项目中的标题重复的算法问题-最长连续公共子串

存储最长字串的信息类:(由于我的需求不需要获取具体字串所以后面不会获取到,仅仅定义而已)

public class CommonResult {
    private String commonStr;
    private int commonCount;
    private  int length;

    public CommonResult() {
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public String getCommonStr() {
        return commonStr;
    }

    public void setCommonStr(String commonStr) {
        this.commonStr = commonStr;
    }

    public int getCommonCount() {
        return commonCount;
    }

    public void setCommonCount(int commonCount) {
        this.commonCount = commonCount;
    }
 }

关键算法:

//最长连续公共子串 
    public   CommonResult maxUtilStr(String str1, String str2) {
        CommonResult commonResult = new CommonResult();
        //把字符串转成字符数组
        char[] arr1 = str1.toCharArray();
        char[] arr2 = str2.toCharArray();
        // 把两个字符串分别以行和列组成一个二维矩阵
        int[][] temp = new int[arr1.length][arr2.length];
        // 存储最长公共子串长度
        int length = 0;
        //start表明最长公共子串的起始点,end表明最长公共子串的终止点
        int end = 0;
        int start = 0;
        初始化二维矩阵中的第一行
        for (int i = 0; i < arr2.length; i++) {
            temp[0][i] = (arr1[0] == arr2[i]) ? 1 : 0;
        }
        //初始化二维矩阵中的第一列
        for (int j = 0; j < arr1.length; j++) {
            temp[j][0] = (arr2[0] == arr1[j]) ? 1 : 0;
        }
        //嵌套for循环:比较二维矩阵中每个点对应行列字符中否相等,相等的话值设置为1,否则设置为0
        //构建目标矩阵过程
        for (int i = 1; i < arr1.length; i++) {
            for (int j = 1; j < arr2.length; j++) {
                if (arr1[i] == arr2[j]) {
                    temp[i][j] = temp[i - 1][j - 1] + 1;

                    if (temp[i][j] > length) {
                        length = temp[i][j];
                        end = j;
                    }
                } else {
                    temp[i][j] = 0;
                }
            }
        }

        int  arr_length = (arr1.length>arr2.length?arr1.length:arr2.length) + 1;
        int[] end_A=new int[arr_length];	//记录LCS在字符串A中结束的位置
        int num_max_length = 0;	//记录LCS的个数
        boolean flag=true;

        //统计最长连续公共子串出现的个数
        for(int i=0;i<arr1.length;i++){
            for(int j=0;j<arr2.length;j++){
                if(temp[i][j] == length){
                    num_max_length++;
                }
            }
        }
        //最长连续公共子串的个数
        commonResult.setCommonCount(num_max_length);
        commonResult.setLength(length);
        return commonResult;
    }

具体使用获取的数据进行需求处理:

 CommonResult commonResult=new CommonResult();
        for (Blog bb:blogList
        ) {
        	//若是新增的帖子,则检查所有已有帖子标题,否则除了自身外的所有帖子都检测
            if(blog.getId()==null ||  blog.getId()!=bb.getId())
            commonResult=maxUtilStr(blog.getTitle(),bb.getTitle());
            if(commonResult.getCommonCount()*commonResult.getLength()*1.0/blog.getTitle().length()>=0.8){
                blog.setRr(1);
                break;
            }
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值