码迷,mamicode.com
首页 > 其他好文 > 详细

字符串题目集锦

时间:2018-01-25 21:53:33      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:for   public   char   题目   效率   ceil   com   col   src   

2018-01-24 20:19:48

  • 重复字符串匹配

问题描述:

技术分享图片

问题求解:

使用brute force的方法求解,也就是依次比较,但是差别就是在A到末尾的时候循环从头开始继续进行比较。

    public int repeatedStringMatch(String A, String B) {
        for (int i = 0,j; i < A.length(); i++) {
            for (j = 0; j < B.length() && B.charAt(j) == A.charAt((i+j) % A.length()); j++);
            // i就是A中前面失配的个数,j.length = 部分1 + n * A.length + 部分2
            // i + j = i + 部分1 + n * A.length + 部分2 =(n + 1)* A.length + 部分2
            // 所以其实就是一个向上取整
            if(j == B.length()) return (i+j) / A.length() + ((i + j) % A.length() == 0 ? 0 : 1);
        }
        return -1;
    }

使用brute force的方法求解的运行效率是很低的,可以采用KMP算法加之改进。

    public int repeatedStringMatch(String A, String B) {
        int[] prefix = new int[B.length()];
        for (int i = 1, j = 0; i < B.length(); ) {
            if (B.charAt(i) == B.charAt(j)) prefix[i++] = ++j;
            else if (j == 0) i++;
            else j = prefix[j - 1];
        }
        for (int i = 0, j = 0; i < A.length(); i += j - prefix[j - 1], j = prefix[j - 1]) {
            while (j < B.length() && A.charAt((i + j) % A.length()) == B.charAt(j)) j++;
            if (j == B.length()) return (int)Math.ceil((double)(i + j) / A.length());
            if (j == 0) j++;
        }
        return -1;
    }

 

字符串题目集锦

标签:for   public   char   题目   效率   ceil   com   col   src   

原文地址:https://www.cnblogs.com/TIMHY/p/8343820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!