美文网首页
算法应用(一)

算法应用(一)

作者: Sweet丶 | 来源:发表于2020-09-03 16:28 被阅读0次
    1. 写一个函数使得在键盘输入的字符在输入"#"符号之后倒序输出输入的东西,如:输入:ABC#, 输出CBA.
    void printReversl(){
        char a;
        scanf("%c", &a);
        if (a != '#')  printReversl();
        if (a != '#') printf("%c\n", a);
    }
    
    1. 手写字符匹配算法KMP。
    // 用next数组装着元素回溯比较的下标
    void getNext(String T, int *next){
        int j = 0;
        int i = 1;
        next[1] = 0;// 第一个元素的next默认就是0
        
        while (i < T[0]) {
            if (0 == j || T[i] == T[j]) {
                i++;
                j++;
               next[i] = j;
            }else{
                j = next[j];
            }
        }
    }
    
    // 返回值为匹配成功的位置,若匹配失败返回值=0.
    int Index_KMP( String S, String T, int startPositon){
        int i = startPositon;// 从第startPositon开始在字符串S 中找子串T
        int j = 1;// 子串T中第一个元素是子串的长度,所以从第一个位置开始去匹配
        
        // 先生成T的next数组,next装着每个字符比较失败后回溯到下一个要比较的元素下标
        int next[10];
        getNext(T, next);
        
        while ( i <= S[0] && j <= T[0]) {
            if (S[i] == T[j]) {
                i++;
                j++;
            }else{
                if (0 == next[j]) {
                    // 因为next[1]=0的,为0说明在最开头的位置跟现在的位置元素一样的,所以这个时候直接从下一个位置开始重新查找
                    i++;
                    j=1;
                }else{
                    j = next[j];
                }
            }
        }
        
        if (j > T[0]) {
            return i - T[0];
        }
        return 0;
    }
    
    + (void)test{
       char T[10] = " abcabaaa";
        char S[25] = " fdsafaaabcabaaadsafds";
        T[0] = 8;
        S[0] = 21;
        int position =  Index_KMP(S , T, 1);
        NSLog(@"在第 %d 个位置找到了", position);
    }
    
    
    

    相关文章

      网友评论

          本文标题:算法应用(一)

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