基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取?
1.簡(jiǎn)述
描述:
Catcher是MCA國(guó)的情報(bào)員,他工作時(shí)發(fā)現(xiàn)敵國(guó)會(huì)用一些對(duì)稱的密碼進(jìn)行通信,比如像這些ABBA,ABA,A,123321,但是他們有時(shí)會(huì)在開(kāi)始或結(jié)束時(shí)加入一些無(wú)關(guān)的字符以防止別國(guó)破解。比如進(jìn)行下列變化 ABBA->12ABBA,ABA->ABAKK,123321->51233214 。因?yàn)榻孬@的串太長(zhǎng)了,而且存在多種可能的情況(abaaab可看作是aba,或baaab的加密形式),Cathcer的工作量實(shí)在是太大了,他只能向電腦高手求助,你能幫Catcher找出最長(zhǎng)的有效密碼串嗎?
數(shù)據(jù)范圍:字符串長(zhǎng)度滿足1 \le n \le 2500 \1≤n≤2500
輸入描述:
輸入一個(gè)字符串(字符串的長(zhǎng)度不超過(guò)2500)
輸出描述:
返回有效密碼串的最大長(zhǎng)度
示例1
輸入:
ABBA
輸出:
4
示例2
輸入:
ABBBA
輸出:
5
示例3
輸入:
12HHHHA
復(fù)制輸出:
4
2.代碼實(shí)現(xiàn)
?解題思路:
最長(zhǎng)回文子串的中心擴(kuò)散法,遍歷每個(gè)字符作為中間位,進(jìn)行左右比較
算法流程:
從右到左,對(duì)每個(gè)字符進(jìn)行遍歷處理,并且每個(gè)字符要處理兩次,因?yàn)榛匚淖哟袃煞N情況:
ABA型:只需要從當(dāng)前字符向兩邊擴(kuò)散,比較左右字符是否相等,找出以當(dāng)前字符為中心的最長(zhǎng)回文子串長(zhǎng)度
ABBA型:只需要從當(dāng)前字符和下一個(gè)字符向兩邊擴(kuò)散,比較左右字符是否相等,找出以當(dāng)前字符和下一個(gè)字符為中心的最長(zhǎng)回文子串長(zhǎng)度
最后比對(duì)兩種類型的長(zhǎng)度,取自較長(zhǎng)的長(zhǎng)度
import java.util.Scanner;
public class Main {
? ? public static void main(String[] args) {
? ? ? ? Scanner sc = new Scanner(System.in);
? ? ? ? String s = sc.nextLine();
? ? ? ? System.out.println(solution(s));
? ? }
? ??
? ? private static int solution(String s) {
? ? ? ? int res = 0;
? ? ? ? for(int i = 0; i < s.length(); i++) {
? ? ? ? ? ? // ABA型
? ? ? ? ? ? int len1 = longest(s, i, i);
? ? ? ? ? ? // ABBA型
? ? ? ? ? ? int len2 = longest(s, i, i + 1);
? ? ? ? ? ? res = Math.max(res, len1 > len2 ? len1 : len2);
? ? ? ? }
? ? ? ? return res;
? ? }
? ??
? ? private static int longest(String s, int l, int r) {
? ? ? ? while(l >= 0 && r < s.length() && s.charAt(l) == s.charAt(r)) {
? ? ? ? ? ? l--;
? ? ? ? ? ? r++;
? ? ? ? }
? ? ? ? return r - l - 1;
? ? }
}方法二:動(dòng)態(tài)規(guī)劃
解題思路:
對(duì)于最值問(wèn)題,往往可以采用動(dòng)態(tài)規(guī)劃思想降低時(shí)間復(fù)雜度和狀態(tài)壓縮,采用空間換時(shí)間的思想
算法流程:
確定狀態(tài):對(duì)比的兩個(gè)字符索引起始和終止索引位置
定義 dp 數(shù)組:字符串s的 i 到 j 索引位置的字符組成的子串是否為回文子串
狀態(tài)轉(zhuǎn)移: 如果左右兩字符相等, 同時(shí)[l+1...r-1]范圍內(nèi)的字符是回文子串, 則[l...r] 也是回文子串
狀態(tài)轉(zhuǎn)移的同時(shí),不斷更新對(duì)比的子串長(zhǎng)度,最終確定最長(zhǎng)回文子串的長(zhǎng)度
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
? ? public static void main(String[] args) throws IOException {
? ? ? ? BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
? ? ? ? String s = "";
? ? ? ? while ((s = br.readLine()) != null) {
? ? ? ? ? ? System.out.println(validLen(s));
? ? ? ? }
? ? ? ? br.close();
? ? }
? ? public static int validLen(String s) {
? ? ? ? int len = s.length();
? ? ? ? // 狀態(tài):對(duì)比的兩個(gè)字符索引起始和終止索引位置
? ? ? ? // 定義: 字符串s的i到j(luò)字符組成的子串是否為回文子串
? ? ? ? boolean[][] dp = new boolean[len][len];
? ? ? ? int res = 0;
? ? ? ? // base case
? ? ? ? for(int i = 0; i < len - 1; i++) {
? ? ? ? ? ? dp[i][i] = true;
? ? ? ? }
? ? ? ? for(int r = 1; r < len; r++) {
? ? ? ? ? ? for(int l = 0; l < r; l++) {
? ? ? ? ? ? ? ? // 狀態(tài)轉(zhuǎn)移:如果左右兩字符相等,同時(shí)[l+1...r-1]范圍內(nèi)的字符是回文子串
? ? ? ? ? ? ? ? // 則 [l...r] 也是回文子串
? ? ? ? ? ? ? ? if(s.charAt(l) == s.charAt(r) && (r-l <= 2 || dp[l+1][r-1])) {
? ? ? ? ? ? ? ? ? ? dp[l][r] = true;
? ? ? ? ? ? ? ? ? ? // 不斷更新最大長(zhǎng)度
? ? ? ? ? ? ? ? ? ? res = Math.max(res, r - l + 1);
? ? ? ? ? ? ? ? }?
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return res;
? ? }
}到此這篇關(guān)于基于Java解決華為機(jī)試實(shí)現(xiàn)密碼截取 的文章就介紹到這了,更多相關(guān)Java密碼截取 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 基于Java解決華為機(jī)試之字符串加解密?
- ?基于Java解決華為機(jī)試之字符串合并處理實(shí)操
- java實(shí)現(xiàn)IP地址轉(zhuǎn)換
- Java實(shí)現(xiàn)IP地址到二進(jìn)制的轉(zhuǎn)換
- Java實(shí)現(xiàn)ip地址和int數(shù)字的相互轉(zhuǎn)換
- Java編程IP地址和數(shù)字相互轉(zhuǎn)換代碼示例
- 使用Java代碼將IP地址轉(zhuǎn)換為int類型的方法
- java實(shí)現(xiàn)ip地址與十進(jìn)制數(shù)相互轉(zhuǎn)換
- 基于Java解決華為機(jī)試實(shí)現(xiàn)整數(shù)與IP地址間的轉(zhuǎn)換?
相關(guān)文章
springboot?正確的在異步線程中使用request的示例代碼
這篇文章主要介紹了springboot中如何正確的在異步線程中使用request,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
Java Spring分別實(shí)現(xiàn)定時(shí)任務(wù)方法
這篇文章主要為大家詳細(xì)介紹了Java與Spring設(shè)置動(dòng)態(tài)定時(shí)任務(wù)的方法,定時(shí)任務(wù)的應(yīng)用場(chǎng)景十分廣泛,如定時(shí)清理文件、定時(shí)生成報(bào)表、定時(shí)數(shù)據(jù)同步備份等2022-07-07
Spring?BeanDefinition父子關(guān)系示例解析
這篇文章主要為大家介紹了Spring?BeanDefinition父子關(guān)系示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08
idea推送項(xiàng)目到gitee中的創(chuàng)建方法
這篇文章主要介紹了idea推送項(xiàng)目到gitee中的創(chuàng)建方法,本文通過(guò)圖文實(shí)例相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08
SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第11戰(zhàn)之查詢和刪除商品功能實(shí)現(xiàn)的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06
Spring boot 連接多數(shù)據(jù)源過(guò)程詳解
這篇文章主要介紹了Spring boot 連接多數(shù)據(jù)源過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08
spring boot項(xiàng)目生成docker鏡像并完成容器部署的方法步驟
這篇文章主要介紹了spring boot項(xiàng)目生成docker鏡像并完成容器部署的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10

