前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java使用Sunday算法来根据字符串内容查找文件

Java使用Sunday算法来根据字符串内容查找文件

原创
作者头像
cg错过
修改2020-12-03 10:26:58
1.3K0
修改2020-12-03 10:26:58
举报
文章被收录于专栏:程序笔记
前言

最近工作比较忙, 不怎么有时间来更新公众号文章. 刚松手, 就想来搞一篇. 所以这篇文章搬运来自自己博客中的文章

正文如下

今天周末,出租屋无聊便来公司呆着。顺便看看Sunday算法 Sunday算法的查找匹配速率比KMP算法快,其匹配规则也简单易懂.

其移动位数主要时参考与字符串中参加匹配的最末位字符的下一位字符,如果该字符并未在搜索串中出现,则将字符串指针移动到该字符的下一位字符,搜索串指针则归零,反之,如果参加匹配的最末位字符的下一位字符出现在搜索串中,则移动位数等于搜索串长度减去搜索串中第一次出现该字符的下标。

详情看末尾的引用,同样也谢谢这两篇文章的作者

java实现代码
代码语言:javascript
复制
public int sundaySearchStrByStr(String strTotal, String strSearch) {

    char charTotal [] = strTotal.toCharArray();
    char charSearch [] = strSearch.toCharArray();

    int t = 0;
    int s = 0;
    int existCount = 0;
    while(s < charSearch.length && t < charTotal.length) {

        if(charSearch[s] == charTotal[t]) {

            if((s + 1) != charSearch.length) {
                s++;
                t++;
            }else {
                existCount++;
                if(charTotal.length - (t + 1) >= charSearch.length) {
                    s = 0;
                    t++;
                }else {
                    break;
                }
            }
        }else {
            int num = t + charSearch.length;
            int index = -1;
            if(num < charTotal.length) {

                for(int i = 0; i < charSearch.length; i++) {
                    if(charTotal[num] == charSearch[i]) {
                        index = i;
                        break;
                    }
                }
                if(index != -1) {
                    t = t + (charSearch.length - index);
                    s = 0;

                }else {
                    t = num + 1;
                    s = 0;
                }
            }else {
                break;
            }
        }
        if(t >= charTotal.length) {
            break;
        }
    }
    return existCount;

}

整个Sunday算法的核心代码即while循环里面的代码,这里主要需注意字符串指针移动时的溢出问题,添加的条件即代码中的num < charTotal.length,满足此条件才能进行下一步,否则则跳出循环 另外,Sunday算法在while循环中多了一部for循环,其做的就是将那下一个字符与搜索串进行匹配,如果第一次就匹配成功,即break

Sunday和KMP对比

就拿之前写的KMP算法代码来对比

KMP算法

Sunday算法

所以总体来说,SundayKMP来说匹配速率更快,代码实现也更简单


首发来自公众号: 程序员品

欢迎关注
欢迎关注

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • java实现代码
  • Sunday和KMP对比
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档