日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【C++】算法集锦(11):敏感词过滤算法(DFA)

發(fā)布時間:2023/12/20 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【C++】算法集锦(11):敏感词过滤算法(DFA) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 什么是 確定的、有窮狀態(tài)、機(jī)
    • 跟我一起看個栗子
      • DFA圖解
      • DFA示例實(shí)現(xiàn)代碼

DFA:確定的 有窮 狀態(tài)機(jī)
如果 設(shè)計(jì)模式 中的狀態(tài)模式比較熟的話,這個就很清楚了。
DFA常用于敏感詞過濾。


什么是 確定的、有窮狀態(tài)、機(jī)

啊,看這個名字,就通俗易懂了嘛。首先它是個機(jī),干嘛用的機(jī)我說一下:模式串篩選用的機(jī)。

常用于從復(fù)雜的字符串中篩選有效信息,可以是敏感詞啊、詞法編輯(編譯器使用)等方面。
當(dāng)然,這是常用,別人這么用。

它這個功能特性啊,我很喜歡。確定、有窮狀態(tài),能想到什么?圖,流程圖!
再細(xì)想,什么流程圖?動態(tài)流程圖,是吧,很自然吧。

普通流程圖那流程都鎖死了,按部就班就好了,但是動態(tài)流程就不一樣了,可能有的人不知道什么叫動態(tài)流程圖,不知道正常,我剛起的名字。動態(tài)聯(lián)編知道吧,就那意思。

我覺得,DFA的機(jī)制很適合用于動態(tài)流程圖的實(shí)現(xiàn),特別是復(fù)雜的,動態(tài)流程圖。當(dāng)然,動態(tài)流程圖是可以暴力硬寫的,就是代碼肥了點(diǎn)而已。


跟我一起看個栗子

這也是我最初接觸到DFA的栗子,當(dāng)時我就是暴力硬寫,當(dāng)然,代碼肥的我都沒臉貼當(dāng)時那篇博客里去。

請你來實(shí)現(xiàn)一個 atoi 函數(shù),使其能將字符串轉(zhuǎn)換成整數(shù)。

首先,該函數(shù)會根據(jù)需要丟棄無用的開頭空格字符,直到尋找到第一個非空格的字符為止。接下來的轉(zhuǎn)化規(guī)則如下:如果第一個非空字符為正或者負(fù)號時,則將該符號與之后面盡可能多的連續(xù)數(shù)字字符組合起來,形成一個有符號整數(shù)。 假如第一個非空字符是數(shù)字,則直接將其與之后連續(xù)的數(shù)字字符組合起來,形成一個整數(shù)。 該字符串在有效的整數(shù)部分之后也可能會存在多余的字符,那么這些字符可以被忽略,它們對函數(shù)不應(yīng)該造成影響。 注意:假如該字符串中的第一個非空格字符不是一個有效整數(shù)字符、字符串為空或字符串僅包含空白字符時,則你的函數(shù)不需要進(jìn)行轉(zhuǎn)換,即無法進(jìn)行有效轉(zhuǎn)換。在任何情況下,若函數(shù)不能進(jìn)行有效的轉(zhuǎn)換時,請返回 0 。

提示:

本題中的空白字符只包括空格字符 ’ ’ 。 假設(shè)我們的環(huán)境只能存儲 32 位大小的有符號整數(shù),那么其數(shù)值范圍為 [?231, 231 ? 1]。 如果數(shù)值超過這個范圍,請返回 INT_MAX (231 ? 1) 或 INT_MIN (?231) 。 示例 1:輸入:42” 輸出: 42 示例 2:輸入: " -42" 輸出: -42 解釋: 第一個非空白字符為 ‘-, 它是一個負(fù)號。 我們盡可能將負(fù)號與后面所有連續(xù)出現(xiàn)的數(shù)字組合起來,最后得到 -42 。 示例 3:輸入:4193 with words” 輸出: 4193 解釋: 轉(zhuǎn)換截止于數(shù)字 ‘3’ ,因?yàn)樗南乱粋€字符不為數(shù)字。 示例 4:輸入: “words and 987” 輸出: 0 解釋: 第一個非空字符是 ‘w’, 但它不是數(shù)字或正、負(fù)號。 因此無法執(zhí)行有效的轉(zhuǎn)換。 示例 5:輸入:-91283472332” 輸出: -2147483648 解釋: 數(shù)字 “-91283472332” 超過 32 位有符號整數(shù)范圍。 因此返回 INT_MIN (?231)

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/string-to-integer-atoi
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。


DFA圖解

我們的程序在每個時刻有一個狀態(tài) s,每次從序列中輸入一個字符 c,并根據(jù)字符 c 轉(zhuǎn)移到下一個狀態(tài) s’。這樣,我們只需要建立一個覆蓋所有情況的從 s 與 c 映射到 s’ 的表格即可解決題目中的問題。

上面這個圖是不是看不太懂,沒關(guān)系,我也看不懂。
但是下面這個表那得看懂:


是吧,第一欄是輸入,第一列是狀態(tài)。其他部分就是特定狀態(tài)下,遇到特定輸入,會觸發(fā)什么狀態(tài)。

這個表嘛,當(dāng)狀態(tài)為in_number的時候意味著可以計(jì)數(shù)了,為signed的時候意味著是符號,為end的時候就意味著該收拾收拾走了。

那,該怎么把這個表轉(zhuǎn)換為代碼呢?


DFA示例實(shí)現(xiàn)代碼

#include<iostream>#include<vector>using namespace std;int DFA(vector<char>& cvec) {vector<vector<int>> vec = { {0,1,2,3},{3,3,2,3},{3,3,2,3},{3,3,3,3} }; //DFAint stat = 0;//實(shí)時狀態(tài),初始化為0int ret = 0; //數(shù)據(jù)紀(jì)錄,姑且初始化為0吧int flag = 1;//正負(fù)號紀(jì)錄for (int sz = 0; sz < cvec.size(); sz++){ //這里是狀態(tài)機(jī)走一圈if (isspace(cvec[sz]))stat = vec[stat][0];else if (cvec[sz] == '+' || cvec[sz] == '-')stat = vec[stat][1];else if (isdigit(cvec[sz]))stat = vec[stat][2];elsestat = 3;//狀態(tài)機(jī)走完該判斷狀態(tài)了if (stat == 3)return ret * flag;else if (stat == 1) //這個最多也就一次機(jī)會進(jìn)了{if (cvec[sz] == '-')flag = -1;}else if (stat == 2) {}//對數(shù)據(jù)進(jìn)行疊加處理,這邊建議先放到數(shù)組里,等返回的時候(stat == 3)一次性處理} }

總結(jié)

以上是生活随笔為你收集整理的【C++】算法集锦(11):敏感词过滤算法(DFA)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。