導航:首頁 > 源碼編譯 > java關鍵字匹配演算法

java關鍵字匹配演算法

發布時間:2024-03-24 09:32:42

『壹』 java 棧 如何實現括弧匹配

java棧實現括弧匹配,主要是使用棧隊列演算法,如下代碼:

importjava.util.Scanner;
importjava.util.Stack;

/**
*@authorOwner
*
*/
publicclassMain{

publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);

intn=sc.nextInt();//3條測試數據數據

Stack<Character>stack=null;

while(n!=0){

//從控制台讀入一個測試字元串[]()[(])
Stringstr=sc.next();
//如果該輸入字元串為奇數,說明不匹配
if(str.length()%2==1){
System.out.println("No");
}else{
//說明字元是偶數
stack=newStack<Character>();

//遍歷第一條測試字元串[]()[(])
for(inti=0;i<str.length();i++){
if(stack.isEmpty()){
//如果棧是空的
stack.push(str.charAt(i));
}elseif(stack.peek()=='['&&str.charAt(i)==']'||stack.peek()=='('&&str.charAt(i)==')'){
//說明此時棧中字元不是空的,並且符合,
stack.pop();
}else{

stack.push(str.charAt(i));
}
}

if(stack.isEmpty()){
//如果棧是空的,說明括弧匹配
System.out.println("Yes");
}else{
//說明棧不為空,括弧不匹配
System.out.println("No");
}
}

n--;
}

}
}

『貳』 求java全字替換演算法、全字匹配演算法

沒做過,只是想到幾個思路:


  1. 如果文本量比較少(幾千或者上萬,具體沒有測試過)並且要查詢和替換的目標在正則中不是很復雜的話,使用正則表達式就可以實現快速的文本的查找和替換,並不需要自己寫演算法。如果文本量很大,就需要自己再想辦法了。

  2. 如果文本量比較大,可以將文本存儲到資料庫中,資料庫提供了文本的查找和替換的功能,並 且此功能已經相當完善,調用相應的資料庫函數可以實現查找和替換。

  3. 如果你只是想學習文字處理上的一些演算法,而非實現查找和替換的功能的話,就當上面什麼都沒說好了.....

『叄』 關於java新聞網站的演算法

問:新聞網站,如新浪網站,比如說國際足球頻道,每天會有跟新。請問這塊在代碼設計的地方,是從資料庫中讀取5條最新的(按照日期)還是說做一個程序由編輯強制置頂?
答:是從資料庫中讀取5條最新的(按照日期)

問:如果是論壇,需要把點擊最高的新聞自動排到前面,這個怎麼處理,需要用到servletcontext嗎 ?
答:讀取點擊最高的新聞記錄(你想讀取幾條就幾條),然後放到網頁上去,就怎麼回事.......跟你平時放其他數據沒什麼區別,都是根據條件取數據而已.

『肆』 Java編程實現字元串的模式匹配

傳統的字元串模式匹配演算法(也就是BF演算法)就是對於主串和模式串雙雙自左向右,一個一個字元比較,如果不匹配,主串和模式串的位置指針都要回溯。這樣的演算法時間復雜度為O(n*m),其中n和m分別為串s和串t的長度。

KMP 演算法是由Knuth,Morris和Pratt等人共同提出的,所以成為Knuth-Morris-Pratt演算法,簡稱KMP演算法。KMP演算法是字元串模式匹配中的經典演算法。和BF演算法相比,KMP演算法的不同點是匹配過程中,主串的位置指針不會回溯,這樣的結果使得演算法時間復雜度只為O(n+m)。

『伍』 字元串匹配演算法的使用(未完待整理)

字元串的匹配在Java中都知道使用indexOf函數來實現,那麼其匹配演算法是怎麼樣的呢?

單模式和多模式的區別就是一次遍歷主串能否將多個模式的字元串都查找出來。

英文全稱為Brute Force,暴力匹配演算法,匹配字元串的方法比較暴力,也比較簡單易懂。其大概的思路就是:

我們可以看到,在極端情況下,在主串 aaaa...aab 中尋找模式串 aab ,那麼總共需要尋找(n-m+1)次,且每次都需要比對m次,那麼時間復雜度將是 (n-m+1)*m ,即 O(n*m) ;但實際上並不會這么低效,因為我們的使用場景中主串和模式串都不會太長,而且在每個子串和模式串進行比對時,只要中途有一個不匹配,那麼當前比對就會提前結束,因此大部分情況下,時間復雜度都會比 O(n*m) 要好。

我們在BF演算法的基礎上引入哈希演算法,我們不需要將每個子串與模式串逐個字元地進行比較,而是計算得出每個子串的hash值,然後和模式串的hash值進行比較,如果有相等的,那就說明有子串和模式串匹配上了。

雖然我們只需要比對模式串和子串的hash值就能得到匹配結果,次數為(n-m+1),但是對每個子串進行hash計算的時候,是要遍歷每個字元的,因此次數也是m,那麼總的時間復雜度還是 O(n*m) ,並沒有明顯地提升。

那麼我們該如何想出一個辦法,使得每個子串hash值的計算時間得到提升呢?這就是RK演算法的精髓,假設子串包含的字元集中元素個數為k,那麼就用k進制數來代表這個子串,然後hash的過程就是將這個k進制的數轉換為十進制的數,這個十進制的數就是該子串的hash值。

相鄰子串的hash值計算是有規律的,我們只需要遍歷一次主串就能得到所有子串的hash值,演算法復雜度為O(n),而不是像原先一樣,每個子串都需要O(m)的時間復雜度。

然後將模式串的hash值和所有子串的hash值進行比較,每次比較的時間復雜度是 O(1) ,總共比較(n-m+1)次,所以RK演算法的總的時間開銷為 O(n)+O(1)*O(n-m+1) ,即為 O(n) ,時間復雜度比BF演算法更加高效。

當然,有hash的地方就有可能會存在hash沖突,有可能子串和hash值和模式串的hash值是一樣的,但內容就是不一樣,此時怎麼辦呢?其實很簡單,對於hash值一樣的子串,我們增加雙保險,再比較一下這m個字元是否都一樣即可,總的時間開銷為 O(n)+O(1)*O(n-m+1)+O(m) ,即為 O(n) 。

如果極端情況下出現了很多hash沖突呢?我們對於每個和模式串相同hash值的子串都需要逐一再進行比較,那麼總的時間開銷就會為 O(n)+O(1)*O(n-m+1)+O(m)*O(n-m+1) ,即為 O(n*m) ,不過這種概率太小了,大部分情況下都不會這樣。

在真正的文本編輯器中查找和替換某個字元串時,使用的演算法既不是上述的BF演算法,也不是RK演算法;BF演算法只適合不是很長的主串,RK演算法則要設計一個沖突概率很低的hash演算法,這個比較困難,所以實際使用的是BM演算法,它是工程中非常常用的一種字元串匹配演算法,效率也是最高的。

演算法的思想和過程有些復雜,待以後整理。

KMP演算法在本質上是和BM演算法一樣的。演算法的思想和過程有些復雜,待以後整理。

瀏覽器輸入框中的智能輸入匹配是怎麼實現的,它是怎麼做動態字元串匹配查找的呢?這就用到了Trie樹。

又名字典樹,是一種專門用來快速查找字元串前綴匹配結果的樹形結構,其本質就是將所有字元串的重復的前綴合並在一起,構造一個多叉樹。

其中,根節點不包含任何信息,每個節點表示一個字元,從根節點到紅色節點的一條路徑表示存儲的一個字元串。當我們在如上Trie樹中查找"he"時,發現"he"並非是一個字元串,而是"hello"和"her"的公共前綴,那麼就會找到這兩個字元串返回。

Trie樹在內存中是如何存儲的呢?因為每一個節點都可能是包含所有字元的,所以每一個節點都是一個數組(或者散列表),用來存儲每個字元及其後綴節點的指針。

使用Trie樹,最開始構建的時候,時間復雜度為 O(n) ,其中n為所有字元串長度之和,但是一旦構建完成,頻繁地查詢某個字元串是非常高效的,時間復雜度為 O(k) ,其中k為查找字元串的長度。

Trie樹雖然查詢效率很高,但是比較浪費內存,每一個節點都必須維護一個數組存放所有可能的字元數據及其指向下一個節點的指針,因此在所有字元串公共前綴並不多的時候,內存空間浪費地就更多了。這種問題其實也有對應的解決辦法,我們可以不使用數組,而是使用有序數組、散列表、紅黑樹來存放,可以相應地降低性能來節省內存空間。

Trie樹除了可以實現瀏覽器動態輸入內容查找候選項的功能外,還可以實現多模式地敏感詞匹配功能。假設我們需要對用戶輸入的內容進行敏感詞檢查,將所有的敏感內容用***代替,那麼該如何實現呢?

首先我們可以維護一個敏感詞字典,使用上述四種單模式匹配演算法也可以實現,但是需要遍歷N次用戶輸入的內容,其中N是所有敏感詞的模式串,顯得非常低效。但是我們如果將敏感詞字典維護為一個Trie樹,然後將用戶輸入的內容從位置0開始在Trie樹中進行查詢,如果匹配到紅色節點,那麼說明有敏感詞;如果沒有匹配到紅色節點,就從用戶輸入內容的下一個位置開始繼續在Trie樹中查詢,直至將用戶輸入內容遍歷完,因此我們只是遍歷了一遍主串。

然而更高效的多模式字元串匹配使用地更多的是如下的AC自動機。

如果把Trie樹比作BF演算法,KMP演算法是BF演算法的改進,那麼AC自動機就是利用同樣的思想改進了Trie樹。

演算法的思想和過程有些復雜,待以後整理。

『陸』 在Java中,設計一個演算法,判斷一個算術表達式中的括弧是否配對。

演算法:
String str="5+(4-3))" 表達式
char kuohao[]; 用作括弧堆棧
掃描str中的字元
1如果是(則入棧
2如果是)
a如果戰不空出棧
b如果棧空,不匹配。演算法結束
最後棧空則匹配

下面是我的實現

public class biaodashi {

public static void main(String args[])
{
int top=0;//堆指針
boolean end=true;//不匹配時只輸出一次

char stack[]=new char[100];//存括弧

String biaoda="(((1+(2)-6))";//表達式
char biao[]=biaoda.toCharArray();//將字元串轉化成字元數組
System.out.println("表達式: "+biaoda);

for(int i=0;i<biao.length&&end;i++)//遍歷表達式中所有字元
{
if(biao[i]=='(')//如果是(則入棧
{
stack[top]='(';
top++;
}
else if(biao[i]==')')//如果是)則出戰
{
if(!(top==0))
top--;
else
{
System.out.println("括弧不匹配");
end=false;
}

}

}//除循環兩種可能

if(top==0&&end)
System.out.println("括弧匹配");//出循環stack空
else if(top!=0&&end)
System.out.println("括弧不匹配");//出循環時stack不空

}

}

閱讀全文

與java關鍵字匹配演算法相關的資料

熱點內容
哪裡app可以上高中生物課 瀏覽:472
cad粗糙度快捷鍵命令大全 瀏覽:521
騰訊雲伺服器無法運行軟體 瀏覽:342
奔跑吧哪個app 瀏覽:97
哪個app聽音樂最好 瀏覽:281
考研英語2真題pdf 瀏覽:699
煙台編程積木教育環境好不好 瀏覽:214
python優秀代碼 瀏覽:620
androidtop命令 瀏覽:455
你平時怎麼排解壓力 瀏覽:68
表格中的文件夾怎樣設置 瀏覽:476
em78單片機 瀏覽:960
splitjava空格 瀏覽:248
電腦怎麼谷歌伺服器地址 瀏覽:515
nx自定義工具啟動宏命令 瀏覽:101
程序員怎麼解決無法訪問互聯網 瀏覽:303
java訪問本地文件 瀏覽:747
瓦斯琪伺服器怎麼用 瀏覽:22
安卓主題用什麼app 瀏覽:747
修改伺服器pci地址空間 瀏覽:321