<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

word文檔解密方法說明

PLC工控專欄 ? 來源:PLC工控專欄 ? 作者:PLC工控專欄 ? 2022-03-14 09:05 ? 次閱讀

word文檔解密方法,【徽信;sjk6070】當我們求取最長回文子串時,常見的方法就是中心擴散法,即從字符中心出發,向兩邊對比,檢查是否相等,若等于,則繼續檢查,并使當前字符中心對應的最長回文子串長度加一,否則,結束該字符中心的回文檢查,比較與當前整個字符串的最長回文子串,考慮是否更新整個字符串的最長回文子串長度,繼續進行下一個字符的判斷。

這種方法的時間復雜度仍為 O(n2)O(n^2)O(n2) ,較普通的暴力破解的方法有著不錯的優化,但也不是最佳的思路,相關的代碼如下:

public class Solution {
private int max = 0;
private String res = “”;
public String longestPalindrome(String s) {
if (s.length() == 1) { return s; }
for (int i = 0; i < s.length()-1; i++) {
checkPalindromeExpand(s,i,i);
checkPalindromeExpand(s,i,i+1);
}
return res;
}
public void checkPalindromeExpand(String s, int low, int high) {
while (low >= 0 && high < s.length()) {
if (s.charAt(low) == s.charAt(high)) {
if (high - low + 1 > max) {
max = high - low + 1;
res = s.substring(low,high+1);
}
low–; high++;
} else {
return;
}
}
}
}
復制代碼
當然,上面這種算法也有優化的空間,基本的思路如下:

統計字符出現頻率,用數組表示出現頻率,當某個字符出現頻率為 1 時,認為該字符可能為某段回文子串的中心點,否則,就不屬于任何一個回文子串
找出頻度為1的字符a,看以a為單核中心向外擴散,求最長回文;如果沒有回文,就將它從串中斷開,進行分治;如果回文長度超過記錄,就保存它
然后從左到右查回文,只有長度超過記錄,才保存
第一次串分割完畢后,進行分治,重新統計頻度,回到1步驟

實現代碼可以借鑒:小馬哥最長回文子串長度求取
Manachar算法
求取最長回文子串的長度的最佳方法為 Manachar算法 ,俗稱馬拉車算法。在了解這個算法之前,我們必須先理解回文子串的一些性質:

假設對于一個回文串,以及其中心位置,由回文串的性質可知,從其中心向兩側逐步擴散到邊界為止,每一步所對應范圍的字串都是回文串

如果我們已知一個回文串的中心點 mid 與其邊界范圍。那么,在大多數情況下,位于邊界內且關于此中心點對稱的兩點a、b,如果有回文串以 a 為中心,那么以 b 為中心的回文串與以 a 為中心的回文串完全相同。并且,它們之間存在這樣的關系:b=2×mid?ab = 2 \times mid - ab=2×mid?a

回文串末尾位置到回文串中心位置的字符長度為該回文串的半徑,若末尾位置的下標為 a ,中心位置的下標為 id ,回文串長度半徑為 len ,即半徑為 len 則它們存在如下關系:
a=id+len÷2a = id + len\div2a=id+len÷2
頭尾添加一個非 * 的特殊符號保證不越界,避免多次判斷是否越界。

為方便處理,將字符串長度可能為奇數,可能為偶數的兩種情況進行合并,即在每個字符的左右都加上一個特殊字符,比如 “?*?”。防止越界情況的出現,在開頭添加一個 “@”可看如下實踐:

從以上實踐可得出,由于插入的 # 號的個數必定等于字符個數加一再加上 兩個@ 字符,所以總長度是偶數+奇數=奇數,通過這種方法,可以將字符串的長度都化為奇數,這樣就不需要對長度奇偶性進行分情況討論。
對字符串完成預處理之后,定義一個數組 len 存入字符串的每個字符作為回文串中心擴散的回文子串長度且為去掉特殊字符的原字符串的總長。

最長回文子串長度:len[i]?1最長回文子串長度:len[i]-1最長回文子串長度:len[i]?1
證明方法如下:

轉換后,所有回文子串的長度為奇數,故以中心位置下標為 i 的最長回文串長度為 2×len[i]?12 \times len[i] - 12×len[i]?1
在回文串中,特殊字符數為 len[i] ,而除去特殊字符數剩下的就為原字符數,即 (2×len[i]?1)?len[i]=len[i]?1(2\times len[i]-1)- len[i] = len[i] -1(2×len[i]?1)?len[i]=len[i]?1

問題就轉換為了求取 len[i] 中所有的數。
已知 P 的最長回文子串長度 len[p],則回文串左邊界為 p - len[p],右邊界為 p + len[p]
假設在已知中心 p 的左邊有一點 j ,其對稱點為 i,

若 i > len[p] + p ,暴力比較 ,通常出現在求取最開始時。
若 i < len[p] + p ,且 len[j] < len[p] + p - i (右邊界到 i 的距離),則他被完全包裹入以 p 為中心的子串中,必有 len[i] = len[j]
若 i = len[p] + p ,且 len[j] >= len[p] + p - i , len[i] = len[j],此時,可能存在超出原有 p 的回文區域,仍需從邊界 i + 1 + len[i] 出發一一比較

做完當前中心 i 的長度求取之后,判斷是否 i 的回文區域右邊界大于原有回文右邊界值,若大于,更新中心點為 i ,右邊界為 i 的回文右邊界。
解決 len 數組的求取問題就基本完成對于 Manachar 算法的理解。相關代碼如下:
import java.util.Scanner;

public class Manacher {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.next();
String res = longestPalindrome(str);
System.out.println(res + ": " + res.length());
}
//插入字符
public static String preProcess(String s) {
int n = s.length();
if (n == 0) {
return “^KaTeX parse error: Expected 'EOF', got '}' at position 12: "; }? String…”;
return ret;
}
// 馬拉車算法
public static String longestPalindrome(String str) {
String S = preProcess(str);
int n = S.length();// 保留回文串的長度
int[] len = new int[n];
int center = 0, right = 0;// 保留邊界最右的回文核心以及右邊界
// 從第 1 個字符開始
for (int i = 1; i < n - 1; i++) {
// 找出i對于后面核心的對稱
int mirror = 2 * center - i;
if (right > i) {
// i 在右邊界的范疇內,看看i的對稱點的回文串長度,以及i到右邊界的長度,取兩個較小的那個
// 不能溢出之前的邊界,否則就得核心拓展
len[i] = Math.min(right - i, len[mirror]);
} else {
// 超過范疇了,核心拓展
len[i] = 0;
}

// 核心拓展
while (S.charAt(i + 1 + len[i]) == S.charAt(i - 1 - len[i])) {
len[i]++;
}

// 看看新的索引是不是比之前保留的最右邊界的回文串還要靠右
if (i + len[i] > right) {
// 更新核心
center = i;
// 更新右邊界
right = i + len[i];
}

}

// 通過回文長度數組找出最長的回文串
int maxLen = 0;
int centerIndex = 0;
for (int i = 1; i < n - 1; i++) {
if (len[i] > maxLen) {
maxLen = len[i];
centerIndex = i;
}
}
int start = (centerIndex - maxLen) / 2;
return str.substring(start, start + maxLen);
}


審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • word
    +關注

    關注

    1

    文章

    77

    瀏覽量

    21768
  • 字符
    +關注

    關注

    0

    文章

    229

    瀏覽量

    24976
  • 文檔
    +關注

    關注

    0

    文章

    44

    瀏覽量

    11907
收藏 人收藏

    評論

    相關推薦

    iPad版微軟Word新增頁面邊框功能,提升文檔美觀度

    微軟公司今日宣布,啟動 Microsoft 365 Insider 項目的 iPad 版 Word 應用程序的新功能測試活動——頁面邊框功能開發完成。此項便利有用的功能有助于提升文檔整體美感。
    的頭像 發表于 05-18 14:05 ?284次閱讀

    ARM系列STM32F103芯片的解密方法

    本文介紹ARM系列STM32F103芯片的解密方法,其內核是Cortex-M3,內存從16K-512K都有。
    發表于 02-28 11:20 ?704次閱讀

    網頁版Word添加復選框功能,實現任務跟蹤與習慣養成

    操作方法如下:進入網頁版Word后,用戶可選用已有文檔進行編輯或新建文檔試用此功能;點擊主菜單中的Checklist按鈕或以“Ctrl+,(逗號)”快捷鍵實現插入;確認任務已完成需選中
    的頭像 發表于 02-23 14:38 ?324次閱讀

    網分E5071C中文操作說明

    網分E5071C中文操作?中文說明?中文幫助?word檔可編輯是德E5071C 網絡分析儀 中文操作說明
    發表于 11-30 09:45 ?5次下載

    java怎么注釋整個文檔

    java中可以使用特殊的注釋格式來注釋整個文檔,這種格式被稱為JavaDoc注釋。JavaDoc注釋可以用于生成HTML格式的文檔,包含類、方法、字段、參數等的詳細說明。下面是注釋整個
    的頭像 發表于 11-28 17:14 ?444次閱讀

    java文檔注釋的作用

    Java文檔注釋(JavaDoc)是一種特殊的注釋格式,用于對Java源代碼中的類、方法和字段進行解釋和說明。它有助于開發人員理解代碼的功能、使用和注意事項,并且還可以用于生成軟件文檔
    的頭像 發表于 11-28 17:02 ?477次閱讀

    芯片是怎么被解密的?

    關于解密設備其實是很多種工具,例如我們常常聽說到得FIB設備,其實不能說FIB是解密設備,FIB是聚焦離子束設備,是在納米級的對材料切割和連接的一種儀器
    的頭像 發表于 11-08 11:44 ?628次閱讀

    單片機解密失敗的原因

    單片機解密存在失敗的概率,從我們解密的經驗來看,按概率來講,大概存在1%單片機解密的失敗概率,存在0.3%的損壞母片的概率。所以我們不保證100%解密成功,也不保證100%不破壞母片,
    發表于 10-25 09:49 ?302次閱讀

    三菱FX3UFX3G解密文件方法

    三菱FX3UFX3G解密文件,實測有效,內附方法。
    發表于 10-17 09:30 ?6次下載

    如何使用Python讀取寫入Word文件

    'document.docx' 的 Word 文件并將其存儲在一個名為 doc 的 python-docx 文檔對象中: import docxdoc = docx.Document( 'document.docx' ) 此代碼中,首先導入 python-docx 庫并
    的頭像 發表于 09-27 17:03 ?1540次閱讀

    如何在word表格前添加空行

    有時候在編寫word文檔時,插入一個表格后,需要在表格前面添加一個空行,我之前的做法是將表格向下移動來達到增加空行的目的,這種方法其實并不是很好,下面介紹一個在表格前面快捷添加空行的方法
    的頭像 發表于 09-09 09:36 ?1191次閱讀
    如何在<b class='flag-5'>word</b>表格前添加空行

    NUC505的啟動方式有沒有相關文檔說明?

    NUC505支持多種啟動方式, 每種啟動的方式和流程,有沒有相關文檔說明? 官網沒有找到, 參考文檔也沒有詳細說明
    發表于 08-29 06:27

    word怎么在方框里打勾

    在編寫Word文檔時,有時會碰到在方框里打上勾,這種操作雖然不是經常需要,但是遇到了總要知道怎么去做吧,這里參考網上的一些方法給大家講講。
    的頭像 發表于 06-19 10:36 ?3869次閱讀
    <b class='flag-5'>word</b>怎么在方框里打勾

    工程/數學計算工具mathtype使用分享

    說明你還有在使用的word系列產品如文檔,PPT等,需要關閉他們,因為這個插件需要嵌入到word里面。
    的頭像 發表于 06-15 09:02 ?430次閱讀
    工程/數學計算工具mathtype使用分享

    做芯片解密你最關心的是什么

    中國芯片起步較晚,在追趕先進技術的過程中,芯片解密技術扮演著重要角色,芯片解密公司遍地開花,有芯片解密需求的客戶面臨選擇的困難,究竟該怎么選擇芯片解密公司,是看芯片
    的頭像 發表于 06-14 15:58 ?577次閱讀
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>