1. 程式人生 > >【程式碼向】字串KMS演算法,判斷某一字串是否包含另一字串

【程式碼向】字串KMS演算法,判斷某一字串是否包含另一字串

    public static class KMS
    {
        #region Defines
        public const int StringStartIndex = 0;
        #endregion
        private static int[] GetNext(string s)
        {
            int[] next = new int[s.Length];
            //當與首字元不同時繼續判斷下一個字元是否與首字元相同
            next[StringStartIndex] = StringStartIndex - 1;
            int i = StringStartIndex, j = StringStartIndex - 1;
            while (i < s.Length - 1)
            {
                //前一個或是串內全然不同時重新判斷,後一個是串內部分相同時,從相同處尾開始判斷
                if (j == StringStartIndex - 1 || s[i] == s[j])
                {
                    //此時可以避免進行重複判斷(及相同的字元判斷不同時,索引到前一個相同的字元繼續判斷是否不同
                    if (s[++i] != s[++j])
                        next[i] = j;//此時與之前相同
                    else
                        next[i] = next[j];
                }
                else
                    j = next[j];//之所以不是初始化為StringStartIndex - 1,是為了避免串內相同串內還有相同串
                //例如qwqqaqqwqqqwqqaq,qwqqaq有兩處重複,qwq有三處
            }
            return next;
        }

        public static int KMS_Index(string b, string c)
        {
            int[] next = GetNext(c);
            int i = StringStartIndex - 1, j = StringStartIndex - 1;
            while (i < b.Length && j < c.Length)
            {
                //或判斷的前半句是當與首字元不同時繼續判斷下一字元(因為++j之後j是StringStartIndex),或判斷的後半句是相同時繼續判斷下一個字元是否相同
                if (j == StringStartIndex - 1 || b[i] == c[j])
                {
                    ++i;
                    ++j;
                }
                else
                    j = next[j];
            }
            if (j == c.Length)
                return i - c.Length;
            return -1;
        }
    }

相關推薦

程式碼字串KMS演算法判斷字串是否包含字串

public static class KMS { #region Defines public const int StringStartIndex = 0; #endregion priva

程式碼簡易計算器邏輯

class Program { static void Main(string[] args) { Queue<string> OperationQueue = new Queue<s

程式碼筆記iOS-底下滾動上面標題欄也會跟著變動

#import "RootViewController.h" @interface RootViewController () @end @implementation RootViewController - (id)initWithNibName:(NSString *)nibNameOrNil

資料結構 C描述設計一個演算法用於檢測給定的字串是否為對稱串。

【資料結構 C描述】設計一個演算法,用於檢測給定的字串是否為對稱串。 所謂對稱串,就是字串從左往右讀和從右往左讀的序列一樣。 例如: abccba是對稱串。 abcabc不是對稱串。 //main.cpp #include <iostream> #include

技術DSST目標跟蹤演算法Matlab程式碼執行指南

論文:Accurate Scale Estimation for Robust Visual Tracking(DSST)  1.執行環境 win8.1+matlabR2015a 2.準備工作 將code下載至電腦任意位置,檢視一下檔案,進入目錄D:\DSST_c

技術KCF目標跟蹤演算法Matlab程式碼執行指南

核化相關濾波目前較為流行,便試著跑一下作者João F. Henriques提供的matlab程式碼,一開始各種不成功,在網上也沒有解答。下面把我跑成功的經驗和大家分享。 執行環境 win8.1+matlabR2014a 準備工作 將程式

技術目標跟蹤DSST改進版fDSST演算法程式碼分析

MD大神的fDSST是DSST的加速改進版,文章發表在TPAMI17上先給文章地址: http://www.cvl.isy.liu.se/en/research/objrec/visualtracking/scalvistrack/DSST_TPAMI.pdf f

Java面試實現一個演算法確定一個字串的所有字元是否全都不同

//method to figure out if there's no duplicate char in a ASCII string import java.lang.String boolean isUniquedChars(String myString

ML_Algorithm 1線性迴歸——演算法推導及程式碼實現

::::::::線性迴歸::::::::        第一式                   第二式 從式一到式二,需要新增一個  

程式碼筆記Web-JavaScript-JavaScript字串

一,效果圖。 二,程式碼。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>javascript 字串</title>

程式碼集合連線資料庫、查詢所有資料API介面定義

連線資料庫、查詢所有資料,API介面定義 <?php $dbhost = 'localhost:3306'; //mysql伺服器主機地址 $dbuser = 'root'; //mysql使用者名稱 $dbpass = 'root';//m

機器學習決策樹演算法(二)— 程式碼實現

#coding=utf8 ‘’’ Created on 2018年11月4日 @author: xiaofengyang 決策樹演算法:ID3演算法 ‘’’ from sklearn.feature_extraction import DictVectorize

新手最大團問題和最大獨立子集的懶人演算法(隨機化)

首先,團是什麼呢? 團就是一個點集,點集中任意兩點都有直接的邊相連 舉個栗子: 圖中紅色的點構成了一個團,當然單獨一個點也算是一個團。 那麼,獨立子集又是什麼呢? 和團正好相反,獨立子集也

演算法KMP經典演算法你真的懂了嗎?

有關KMP演算法的書籍、帖子、部落格鋪天蓋地,但是你真的能看懂?你知道為什麼要有next陣列,next陣列到底什麼意思,又該怎麼求next陣列,有了next陣列之後又該怎樣判斷模式串和主串是否匹配成功?本文絕對不是講解KMP演算法最細緻的一篇文章,但卻是為了解決

java初學者匯出jar包隱藏核心實現類程式碼

war包匯出是可以執行起來的。   jar包跟css,js一樣,單獨匯出來的時候可以不不帶原始碼,只有class, 但是:它既安全的隱藏了核心實現類程式碼,又在專案中一樣可以跑起來,沒有報錯資訊。 下面進行演習,分為手動匯出jar 和 在Linux系統沒有介面的時候,純do

C語言實現一個函式可以左旋字串中的k個字元。

.實現一個函式,可以左旋字串中的k個字元。 AABCD左旋一個字元得到ABCDA AABCD左旋兩個字元得到BCDAA 思路: 1.如果直接進行左移,肯定會存在陣列前面的元素丟失。 解決辦法:

程式碼筆記iOS-獲取字串的寬度,高度

一,程式碼。 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loadin

機器學習最近鄰演算法KNN原理、流程框圖、程式碼實現及優缺點

通過機器學習教學視訊,初識KNN演算法,對原理和演算法流程通過小應用進行Python實現,有了自己的一些理解。因此在此整理一下,既是對自己學習的階段性總結,也希望能和更多的朋友們共同交流學習相關演算法,如有不完善的地方歡迎批評指正。1、KNN演算法原理KNN,全稱k-Near

機器學習K-Means演算法的原理流程、程式碼實現及優缺點

分類是根據樣本某些屬性或某類特徵(可以融合多類特徵),把樣本型別歸為已確定的某一類別中。機器學習中常見的分類演算法有:SVM(支援向量機)、KNN(最鄰近法)、Decision Tree(決策樹分類法)

Python設計一個演算法計算出n階乘中尾部零的個數

1.常見的思路:先求N的階乘,再計算零的個數。 (但是,時間消耗太大)    def trailingZeros( n):         S = 1         for i in range(1,n+1):             S = S * i