纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不使用字符串的方法(递归)

问题:判断字符串A在中所有出现字符串B中(长度大于1)的索引。不得使用字符串方法indexof,substring等

  有小伙伴在面试遇到了这个问题,乍一看如果使用使用字符串方法indexof,substring,很简单容易实现,但如果不使用这些方法,怎么样才能实现这个需求呢

  // 思路: 如果不能使用字符串的相应方法,我们可以把字符串转换成数组,使用递归函数不断去比对相应的数组索引,然后把满足条件的索引打印出来,其实很多现在前后端交互处理数据的方法,用的都是递归偏多,千万别小瞧递归!

话不多说,我们先上解决问题的方法:

<script>
     // 其实很多现在前后端交互处理数据的方法,用的都是递归变多,千万别小瞧递归
     // 思路: 不能使用字符串的相应方法,我们可以把字符串转换成数组,首先使用递归不断去比对相应的数组索引
    // 随机的字符
    var str1 = ‘adfacddtgjacbasaclsaacdctacw‘;
    // 条件筛选的字符
    var str2 = ‘basaclsa‘;
    // 把相应的字符串转换为数组
    var arr1 = str1.split(‘‘);
    var arr2 = str2.split(‘‘);

    function test (arr) {
        // 写一个for循环,先把需要筛选的数组arr2第一个索引拿来比对
        for(var i = 0; i < arr1.length; i++){
            // 如果符合,执行下一层
            if(arr[0] === arr1[i]){
                // 进入到这里说明了: arr2的第一份索引的字符,和arr1的索引的字符相同相同
                // 既然第一个索引相同,我们这里就声明一个变量num,让变量num依据arr2的长度去递增
                var num = 0
                function ccc (arr) {
                    // 第一个索引相同,让他们索引分别加上变量num,去比对他们索引后面的位置是否相同,如果满足条件继续让num递增
                    // 直到递增变量num的值等于arr1的长度为止,这时候说明这段索引和arr1完全相同
                    if (arr[num] === arr1[i+num]) {
                        if (num === arr.length-1) {
                            console.log( ‘符合条件的索引是‘, i)
                        }
                        num++
                        // console.log(num)
                        ccc (arr)
                        // 如果不能满足条件,就让该递归跳出
                    }else {
                        return
                    }
                }
                ccc(arr2)
            }
        }
    }
    test(str2)
</script>

  其实一说起递归,我想每个人都不陌生。举个从小就听过的例子:从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山,山里有座庙,庙里有个和尚,和尚在讲故事,从前有座山...

  其实递归,就是在运行的过程中调用自己。程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

实际上这张图就很形象地表达出了递归。

  好了,递归的知识差不多介绍完了。对了!简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。

原文地址:https://www.cnblogs.com/zhaohongcheng/p/11515659.html

时间: 2024-08-28 18:27:05

纯JS实现在一个字符串b中查找另一个字符串a出现的所有位置,并且不使用字符串的方法(递归)的相关文章

linux在所有文件中查找某一个字符

# find <directory> -type f -name "*.c" | xargs grep "<strings>" <directory>是你要找的文件夹:如果是当前文件夹可以省略-type f 说明,只找文件-name "*.c" 表示只找C语言写的代码,从而避免去查binary:也可以不写,表示找所有文件<strings>是你要找的某个字符串 sudo find -type f -n

在相邻元素相差1的数组中查找某一特定元素第一次出现的位置

题目:数组中相邻的每两个数之间的差值是1或-1,给定一个数N,求如何找到第一个N的位置. 如:3,4,3,2,1,2,3,4,3,4,5,6,5   求第一个5所在的位置. #include <stdio.h> #include <stdlib.h> int main(void) { int a[] = {3,4,3,2,1,2,3,4,3,4,5,6,5}; int i, next, to_search; int len = sizeof(a); int count = 0, f

OC-在一个字符串中查找另一个字符串的范围;从一个字符串中提取子串

/* 从字符串@"Welcome to Bejing!",中查找 Beijing的范围. */ #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { NSString * str1 = @"Welcom to Beijing"; NSString * str2 = @"Beijing"; NSRang

Android - 在一个应用程序中启动另外一个已经安装的应用程序或系统程序(前提是要知道该应用程序的主activity和包名)

//组件名称,第一个参数是应用程序的包名,后一个是这个应用程序的主Activity ComponentName com = new ComponentName("com.antroid.Test", "com.antroid.Test.TestActivity"); Intent  intent = new Intent(); //设置部件 intent.setComponent(com); startActivity(intent); 我们也可以使用下面的代码启动

在一个字符串中查找另一个字符串出现的次数

#include<stdio.h> #include <string.h> int strstrcount( char *str1, char *str2 ) { char *str = str1; int c = 0; while( (str = strstr( str, str2 )) != NULL ) { c++; str++; } return c; } int main() { char str1[20]; char str2[20]; gets(str1); gets

在一个字符串中查找还有一个字符串出现的次数

#include<stdio.h> #include <string.h> int strstrcount( char *str1, char *str2 ) { char *str = str1; int c = 0; while( (str = strstr( str, str2 )) != NULL ) { c++; str++; } return c; } int main() { char str1[20]; char str2[20]; gets(str1); gets

[码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在

前言 检索一个字符串是否存在于一个数组中, 最基本的想法应该就是对数组进行循环, 逐个判断数组的每个元素值和给定的值是否相等. (在Java语言还可以把数组转成 List , 在 list 中直接有 contains 方法可以使用) 看一段简单的代码: my @arr2 = qw(str1 str2 str3 str4); foreach(@arr2) { if($_ eq "str2") { print "str2 exist in Array!\n"; last

python使用二分法实现在一个有序列表中查找指定的元素

二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 例如需要查找有序list里面的某个关键字key的位置,那么首先确认list的中位数mid,下面分为三种情况: 如果 list[mid] < key,说明key 在中位数的 右边: 如果 list[mid] > key,说明key 在中位数的 左边: 如果 list[mid] = key,说明key 在中位数的中间: 范围每次缩小一半,写个while的死循环知道找到为止. 二分法查找非常快且非常常用,但

一个字符串中查找另一个字符串出现的次数

#include<stdio.h> #include <string.h> int strstrcount( char *str1, char *str2 ) { char *str = str1; int c = 0; while( (str = strstr( str, str2 )) != NULL ) { c++; str++; } return c; } int main() { char str1[20]; char str2[20]; gets(str1); gets