最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java經(jīng)典問題:連個字符串互為回環(huán)變位

 更新時間:2017年11月14日 14:19:17   作者:Kkky  
連個字符串互為回環(huán)變位經(jīng)常出現(xiàn)在java程序員面試中,這個是考驗程序員的解題思路和方法的最經(jīng)典的一題,小編為大家詳細(xì)分析一下,一起來學(xué)習(xí)吧。

本次給大家?guī)淼氖顷P(guān)于判斷連個字符串是否互為回環(huán)變位(Circular Rotaion)的java程序員面試經(jīng)常出現(xiàn)的題型,給大家做了兩種方式的解答,希望能幫助到你。

一般情況下都是筆試或者是直接上機操作,題型一般都是:如果字符串 s 中的字符循環(huán)移動任意位置之后能夠得到另一個字符串 t,那么 s 就被稱為 t 的回環(huán)變位(circular rotation)。

A string s is a circular rotation of a string t if it matches when the characters are circularly shifted by any number of positions;
e.g., ACTGACG is a circular shift of TGACGAC, and vice versa. Detecting this condition is important in the study of genomic sequences.
Write a program that checks whether two given strings s and t are circular.

關(guān)于解答方面,我給在這里給出了2種方式:
解法一:
將s拆分成左右兩部分,然后另令s'=右+左,遍歷所有情況。如果是回環(huán)字符串的話,其中會有 s'=t 的情況。

public static boolean isCircularRotation(String s, String t) {
    if (s.length() != t.length())
      return false;
    int sLen = s.length();
    for (int i = 0; i <= sLen; i++) {
      // 注意subString的后角標(biāo)的界限
      String sLeft = s.substring(0, i);
      String sRigth = s.substring(i + 1, sLen);
      if ((sRigth + sLeft).equals(t))
        return true;
    }
    return false;
  }

解法二:(巧妙)

public static boolean isCircularRotation_1(String s, String t) {
  return (s.length() == t.length() && (t + t).contains(s));
}

以上就是基本快速的兩種解決方式,關(guān)于這個問題,再給大家看一篇很詳細(xì)的判斷字符串回環(huán)變位解決思路:

如果字符串s中的字符循環(huán)移動任意位置之后能夠得到另一字符串t,那么s就被稱為t的回環(huán)變位。例如,ACTGACG 就是 TGACGAC 的一個回環(huán)變位,反之亦然。判定這個條件在基因組序列中的研究是十分重要的。編寫一個算法檢查兩個給定的字符串s和t是否互為回環(huán)變位。

這是我在《算法(第四版)》里看到的一道練習(xí)題 ,當(dāng)時的第一想法就是遍歷字符串 t,從不同的索引位置將字符串t分解成兩個子串,交換順序拼接后再與s相比是否相等。算法如下:

 public static boolean isCircularRotation(String s, String t) {
    if (s.length() != t.length()) {
      return false;
    }
    int length = s.length();
    for (int i = 1; i <= length; i++) {
      String left = s.substring(0, i);
      String right = s.substring(i, length);
      if ((right + left).equals(t)) {
        return true;
      }
    }
    return false;
  }

后來看答案,提示說可以用一行代碼就能搞定了。當(dāng)時想了想,感覺不太可能,就作罷了。今天重新開始學(xué)習(xí)這本書的時候,再次看到這道題,突然有了想法代碼如下:

public static boolean isCircularRotation(String s, String t) {
    return s.length() == t.length() && (t + t).contains(s);
  }

解釋:如果字符串s和t互為回環(huán)變位,則s可分解為“AB”,t可分解為“BA”。那么t與自身拼接后則為“BABA”,顯然是會包含s的。這種思路比較巧妙,當(dāng)然了,自認(rèn)為算法效率并沒有什么提高。

為什么大家都會對這個經(jīng)典的JAVA問題困惑著?最主要的原因就是解題的思路問題:

容易想復(fù)雜的"回環(huán)變位",思路錯誤,問題就會復(fù)雜化,一起來看下經(jīng)典的誤區(qū)和最終想明白以后的解法。

題目描述很簡單:
如果字符串s重的字符循環(huán)移動任意位置之后能夠得到另一個字符串t,那么s就被成為s的回環(huán)變位(circular rotation) 舉例省略…
問題:請編寫一個程序檢查2個給定的字符串s和t是否互為回環(huán)變位。
提示:判斷條件只需要一行代碼

看到題目當(dāng)時滿腦子想的都是雙重循環(huán)啊,游標(biāo)移動啊各種i,j,k……
結(jié)果來一句這樣的提示,當(dāng)時我就受不了了,決定去看一下答案….

答案是這樣的

(s.length() == t.length()) && (s.concat(s).indexOf(t) >= 0)

乍一看,好像真的可以…頓時鄙視了自己的各種游標(biāo)循環(huán)i,j,k…
(雖然可能底層也是各種循環(huán)游標(biāo)i,j,k,但是別人都實現(xiàn)了的基類直接用明顯更省事…)

但是也發(fā)現(xiàn)自己對String類的concat函數(shù)和indexOf的各種重載不懂

一下是jdk文檔的描述

public String concat(String str)將指定字符串連接到此字符串的結(jié)尾。 
如果參數(shù)字符串的長度為 0,則返回此 String 對象。否則,創(chuàng)建一個新的 String 對象,用來表示由此 String 對象表示的字符序列和參數(shù)字符串表示的字符序列連接而成的字符序列。

示例: 

 "cares".concat("s") returns "caress"
 "to".concat("get").concat("her") returns "together"

參數(shù):
str - 連接到此 String 結(jié)尾的 String。 
返回:
一個字符串,它表示在此對象字符后連接字符串參數(shù)字符而成的字符。
public int indexOf(String str)返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。返回的整數(shù)是 
 this.startsWith(str, k)
 為 true 的最小 k 值。 

參數(shù):
str - 任意字符串。 
返回:
如果字符串參數(shù)作為一個子字符串在此對象中出現(xiàn),則返回第一個這種子字符串的第一個字符的索引;如果它不作為一個子字符串出現(xiàn),則返回 -1。

關(guān)于這個問題,已經(jīng)在上文章闡述的非常清楚了,大家如果對此還有任何的疑問,可以在本文下方留言討論。

相關(guān)文章

  • Java 截取視頻資料中的某一幀作為縮略圖

    Java 截取視頻資料中的某一幀作為縮略圖

    最近項目中有一個需求,就是Java 截取視頻資料中的某一幀作為縮略圖,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaWeb如何實現(xiàn)限制單個賬號多處登錄

    JavaWeb如何實現(xiàn)限制單個賬號多處登錄

    這篇文章主要介紹了JavaWeb如何實現(xiàn)限制單個賬號多處登錄問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 使用System.exit()來優(yōu)雅地終止SpringBoot項目的代碼示例

    使用System.exit()來優(yōu)雅地終止SpringBoot項目的代碼示例

    System.exit() 方法是 Java 中用于退出程序的方法,它接受一個整數(shù)參數(shù),通常被用來指示程序的退出狀態(tài),本文給大家介紹了如何使用System.exit()來優(yōu)雅地終止SpringBoot項目,需要的朋友可以參考下
    2024-08-08
  • Java解決刪除字符使頻率相同問題

    Java解決刪除字符使頻率相同問題

    給你一個下標(biāo)從0開始的字符串 word ,字符串只包含小寫英文字母,你需要選擇一個下標(biāo)并刪除下標(biāo)處的字符,使得word中剩余每個字母出現(xiàn)頻率相同,本文給大家介紹了Java解決刪除字符使頻率相同問題,需要的朋友可以參考下
    2024-02-02
  • Spring時間戳(日期)格式轉(zhuǎn)換方式

    Spring時間戳(日期)格式轉(zhuǎn)換方式

    這篇文章主要介紹了Spring時間戳(日期)格式轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • springmvc直接不經(jīng)過controller訪問WEB-INF中的頁面問題

    springmvc直接不經(jīng)過controller訪問WEB-INF中的頁面問題

    這篇文章主要介紹了springmvc直接不經(jīng)過controller訪問WEB-INF中的頁面問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • SpringBoot + Mybatis Plus 整合 Redis的詳細(xì)步驟

    SpringBoot + Mybatis Plus 整合 Redis的

    文章詳細(xì)介紹了Redis在用戶管理系統(tǒng)中的應(yīng)用,包括用戶信息緩存、Token存儲、接口限流、重復(fù)提交攔截和熱點數(shù)據(jù)預(yù)加載等場景,并提供了具體的實現(xiàn)方案和步驟,感興趣的朋友一起看看吧
    2025-03-03
  • Java實現(xiàn)AWT四大事件的詳細(xì)過程

    Java實現(xiàn)AWT四大事件的詳細(xì)過程

    AWT的事件處理是一種委派式事件處理方式:普通組件(事件源)將整個事件處理委托給特定的對象(事件監(jiān)聽器);當(dāng)該事件源發(fā)生指定的事件時,就通知所委托的事件監(jiān)聽器,由事件監(jiān)聽器來處理這個事件
    2022-04-04
  • 圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼

    圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼

    本篇文章主要介紹了圖解二叉樹的三種遍歷方式及java實現(xiàn)代碼,具有一定的參考價值,有興趣的可以了解一下
    2017-07-07
  • mybatis實現(xiàn)一對一關(guān)聯(lián)映射實例代碼

    mybatis實現(xiàn)一對一關(guān)聯(lián)映射實例代碼

    這篇文章主要給大家介紹了關(guān)于mybatis實現(xiàn)一對一關(guān)聯(lián)映射的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11

最新評論

澄江县| 潞城市| 泰州市| 普定县| 黄山市| 梅州市| 余姚市| 绥棱县| 永丰县| 铜川市| 琼海市| 麻阳| 安远县| 陇西县| 藁城市| 扬中市| 长泰县| 宁海县| 宣威市| 巴彦淖尔市| 陵水| 营山县| 彭州市| 巢湖市| 张家川| 镇原县| 仁怀市| 丹棱县| 专栏| 伊通| 伊川县| 塘沽区| 响水县| 汾阳市| 郎溪县| 长阳| 松原市| 上林县| 那坡县| 札达县| 乌苏市|