美文网首页
一、java实现查找字符串在文本出现的次数

一、java实现查找字符串在文本出现的次数

作者: 冒泡人生 | 来源:发表于2020-05-13 14:05 被阅读0次

每日记录分析一个小算法

第一种实现方式

中心思想:不断的去切割文本去匹配第一个符合条件的字符串

代码如下

  private static int strAppearInTextCount(String sourceStr, String findStr) {
        int count = 0;
        while (true) {
            //获取文本中第一个匹配的字符串的位置
            int index = sourceStr.indexOf(findStr);
            //index=-1代表没有匹配到
            if (index != -1) {
                //每次都对sourceStr截取,从上一次找到的字符串末尾位置开始截取
                sourceStr = sourceStr.substring(index + findStr.length());
                count++;
            } else {
                break;
            }
        }
        return count;
    }
时间复杂度:

假设文本出现的次数是m次,文本的长度是n,匹配的字符服串的长度是k,时间复杂度是O(m* n* k),其中n *k是indexof()方法中消耗的时间复杂度咱们可以看下源码如下

 static int indexOf(String source,
                       String target,
                       int fromIndex) {
        final int sourceLength = source.length();
        final int targetLength = target.length();
        if (fromIndex >= sourceLength) {
            return (targetLength == 0 ? sourceLength : -1);
        }
        if (fromIndex < 0) {
            fromIndex = 0;
        }
        if (targetLength == 0) {
            return fromIndex;
        }

        char first = target.charAt(0);
        int max = (sourceLength - targetLength);

        for (int i = fromIndex; i <= max; i++) {
            /* Look for first character. */
            if (source.charAt(i)!= first) {
                while (++i <= max && source.charAt(i) != first);
            }

            /* Found first character, now look at the rest of v2 */
            if (i <= max) {
                int j = i + 1;
                int end = j + targetLength - 1;
                for (int k = 1; j < end && source.charAt(j)
                         == target.charAt(k); j++, k++);

                if (j == end) {
                    /* Found whole string. */
                    return i;
                }
            }
        }
        return -1;
    }
    

可以看出java 源码中匹配字符串是遍历一个个字符查找的

空间复杂度:

假设文本出现的次数是m次,文本的长度是n,匹配的字符服串的长度是k,每次文本截取的时候都会subString()然后赋值,因为java字符串的不可变性,每次赋值都会重新申请一片内存。空间复杂度是O(m)

第二种实现方式

中心思想:优化字符串赋值导致消耗内存的问题,

可以利用indexof()的重载方法,indexof(str,fromIndex)第二个参数是从该位置开始匹配字符串,每次更新这个参数即可
代码如下

    private static int strAppearInTextCount(String sourceStr, String findStr) {
        int count = 0;
        int index = 0;
        while (true) {
            //判断是不是没有符合条件的字符串了
            if (index != -1) {
                //每次更新下次要检索的位置起点,它等于上一次匹配的字符串的结束位置
                index = sourceStr.indexOf(findStr, index) + findStr.length();
                count++;
            } else {
                break;
            }
        }
        return count;
    }

时间复杂度:O(m *n * k) 空间复杂度O(1)

第三种实现方式

中心思想:KMP算法 可以将indexof()时间复杂度优化至O(n)

不足之处希望大家指出

相关文章

  • 一、java实现查找字符串在文本出现的次数

    每日记录分析一个小算法 第一种实现方式 中心思想:不断的去切割文本去匹配第一个符合条件的字符串 代码如下 时间复杂...

  • 查找字符串中,出现最先出现最多的字符

    查找字符串中,出现最先出现最多的字符 查找字符串中最先出现次数最多的字符。首先需要查找出现次数最多的字符串,然后查...

  • PYTHON 查找文本出现次数

    输出为:4

  • js基础之字符串方法

    indexOf,search查找字符串中指定文本首次出现的索引位置 lastIndexOf查找字符串中指定文本最后...

  • 其他题目

    1.合并表记录 字串的连接最长路径查找 3.坐标移动 4.实现删除字符串中出现次数最少的字符,若多个字符出现次数一...

  • [程序员日记]16题了解OC字符串

    查找一个字符串2在字符串1中出现的次数 -(NSUInteger)countOfString:(NSString...

  • 查找字符串中重复字符及次数

    需求:查找字符串中重复字符及次数,并输出出现次数最多的字符及次数例如:"ddadgjioajgial"输出:出现最...

  • String 常用方法

    1、查找字符串中的字符串 indexOf() 返回指定文本在字符串首次出现的索引 没有返回-1 last...

  • 面试知识点

    排序冒泡排序快速排序选择排序插入排序二路归并 查找二分查找 排序和查找的java实现 java语言Java字符串字...

  • mac下常用终端命令

    1.vim 搜索关键词:/ 后输入查找的字符串,点回车,显示文本中第一个出现的字符串。?后输入查找的字符串,点回车...

网友评论

      本文标题:一、java实现查找字符串在文本出现的次数

      本文链接:https://www.haomeiwen.com/subject/ckvgnhtx.html