1. 程式人生 > >【面試演算法】——字串(三)

【面試演算法】——字串(三)

一、詞語變形

題型:

給定兩個字串str1和str2,如果str1和str2中出現的字元種類一樣且每種字元出現的次數也一樣,那麼str1與str2互為變形詞,請實現函式判斷兩個字元是否互為變形詞

舉例

str1=“123”,str2=“231”,返回true;

str1=“123”,str2=“2331”,返回false;

思路:

使用雜湊表實現對字元的計數,首先對str1建立雜湊表1,記錄字元出現的種類和每種字元出現的次數;然後對str2建立雜湊表2;最後對比雜湊表1和雜湊表2的記錄是否一致。(同時可以使用固定長度的陣列替代雜湊表的結構,這樣更加節省空間,速度也更快)

例題:

對於兩個字串A和B,如果A和B中出現的字元種類相同且每種字元出現的次數相同,則A和B互為變形詞,請設計一個高效演算法,檢查兩給定串是否互為變形詞。

給定兩個字串AB及他們的長度,請返回一個bool值,代表他們是否互為變形詞。

程式碼舉例:

import java.util.*;

public class Transform {
    public boolean chkTransform(String A, int lena, String B, int lenb) {
        // write code here
        //首先,如果兩個字串的長度不同,那麼意味著這都兩個字串要麼存在不同的元素,要麼元素數量不同。
        if(A==null || B==null || lena!=lenb){
            return false;
        }
        //首先將這來兩個字串轉換為字元陣列
        char[] chaA = A.toCharArray();
        char[] chaB = B.toCharArray();
        //然後建立一個固定陣列來表示雜湊表結構,這裡如果ascll碼範圍為65535的話就建立一個長度為65536的陣列
        //這裡ascll碼長度為255,這裡map的下標其實就是表示字元的ascll碼的數值
        int[] map = new int[256];
        //遍歷第一個字元陣列,建立雜湊表結構
        for(int i=0;i<chaA.length;i++){
            map[chaA[i]]++;
        }
        //接下來遍歷第二個字元陣列
        for(int j=0;j<chaB.length;j++){
            //如果沒有,則表示存在不同的字元,或者經過減一操作,A中的相同字元已經減為0
            if(map[chaB[j]]==0){
                return false;
            }
            //沒判斷一次,將雜湊表記錄數減一
            map[chaB[j]]--;
        }
        return true;
    }
}

二、旋轉詞判斷

例題:

給定兩個字串,str1和str2,把str前面任意的部分挪到後面形成的字串叫做str的旋轉詞。比如str=“1234”,那麼str的旋轉詞有“1234”,“2341”,“3412”,“4123”。給定兩個字串a和b,請判斷a和b是否互為旋轉詞。

思路:

首先解決這個題目的最佳時間複雜度為O(n),然後我們首先要判斷這兩個字串長度是不是相等的,首先生成一個str1+str1的大字串,然後用KMP演算法判斷大字串中是否包括str2,如果包括則str2和str1互為旋轉詞。

import java.util.*;

public class Rotation {
    public boolean chkRotation(String A, int lena, String B, int lenb) {
        // write code here
        //首先判斷字串是否相等
        if(lena != lenb){
            return false;
        }
        //建立大字串
        String big = A+A;
        return getIndexOf(big,B) != -1;
    }
    //呼叫KMP演算法,計算最大子串
    public int getIndexOf(String s, String m) {
        if (s == null || m == null || m.length() < 1 || s.length() < m.length()) {
            return -1;
        }
        char[] ss = s.toCharArray();
        char[] ms = m.toCharArray();
        int[] nextArr = getNextArray(ms);
        int index = 0;
        int mi = 0;
        while (index < ss.length && mi < ms.length) {
            if (ss[index] == ms[mi]) {
                index++;
                mi++;
            } else if (nextArr[mi] == -1) {
                index++;
            } else {
                mi = nextArr[mi];
            }
        }
        return mi == ms.length ? index - mi : -1;
    }
    //獲取next陣列
    public int[] getNextArray(char[] ms) {
        if (ms.length == 1) {
            return new int[] { -1 };
        }
        int[] nextArr = new int[ms.length];
        nextArr[0] = -1;
        nextArr[1] = 0;
        int pos = 2;
        int cn = 0;
        while (pos < nextArr.length) {
            if (ms[pos - 1] == ms[cn]) {
                nextArr[pos++] = ++cn;
            } else if (cn > 0) {
                cn = nextArr[cn];
            } else {
                nextArr[pos++] = 0;
            }
        }
        return nextArr;
    }
}

當然,如果只是判斷str2是否在str1中,我麼你只需要呼叫Java中的一個方法,contains,這個方法可以判斷一個字串是否包含另一個字串。

程式碼如下:

import java.util.*;
 
public class Rotation {
    public boolean chkRotation(String A, int lena, String B, int lenb) {
        // write code here
       if(lena!=lenb){
           return false;
       }
        String C = A+A;
        return C.contains(B);
    }
}

相關推薦

面試演算法——字串

一、詞語變形 題型: 給定兩個字串str1和str2,如果str1和str2中出現的字元種類一樣且每種字元出現的次數也一樣,那麼str1與str2互為變形詞,請實現函式判斷兩個字元是否互為變形詞 舉例: str1=“123”,str2=“231”,返回true; s

NOJ1084演算法實驗四DP_動態規劃花生米

1084.花生米(三) 時限:1000ms 記憶體限制:10000K  總時限:3000ms 描述 五一長假第三天,Tom和Jerry在倉庫散步的時候又發現了一堆花生米(倉庫,又見倉庫……)。這次Tom制定分花生米規則如下:  ???????1、Tom和Je

面試演算法——二叉樹

一、二叉樹問題概述 二叉樹型別的題目為常考題型 原因: 能夠結合佇列、棧、連結串列、字串等多資料結構 需要掌握圖的基本遍歷方法,比如BFS和DFS 需要掌握遞迴函式的使用,並自己設計出遞迴過程 二叉樹問題與實際工作結合緊密   二、二叉樹先序

面試演算法——連結串列

一、連結串列是否有環判斷 題型: 判斷一個連結串列是否有環?如果無環則返回空,如果有環則返回第一個入環節點。 思路: 這類題目如果對於空間複雜度沒有要求的話,我們可以使用雜湊表來幫助我們實現遍歷連結串列過程中,連結串列節點的訪問記錄。但是這類題目的最佳解法可以做到空間複雜度為O(1)

面試演算法——連結串列

一、連結串列 1.連結串列問題演算法難度不高,但是考察程式碼實現能力 2.連結串列和陣列都是一種線性結構 陣列是一段連續的儲存空間 連結串列空間不一定是保證連續的,為臨時分配的 3.連結串列的分類 4.連結串列問題程式碼實現的關鍵點 (1)連結串列調整函

leetcode:Maximum Depth of Binary Tree計算二叉樹深度 面試演算法

題目: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node do

C語言天天練typedef具體解釋

tar 原因 外部 指向 可用 引入 解釋 trac 兩個 引言: typedef能夠看作type define的縮寫,顧名思義就是類型定義,也就是說它僅僅是給已有的類型又一次定義了一個方便使用的別名。並沒有產生新的數據類型。 typed

海亮集訓DAY12對揹包的補充二的補充——第k優解

專輯:海量集訓-動態規劃-揹包 分三次更新 對第三次更新的補充 對於上次的更新,由於我還沒將第k優解的演算法研究透,所以就暫時沒有寫,在這裡不上 揹包的第k優解 第k優解,顧名思義,就是讓我們求出一個揹包問題的第k優解

Python資料結構與演算法Array陣列

Array(陣列) 下圖為6個元素 [15, 6, 12, 9, 13, 20] 的陣列: 陣列是一個盛有單一型別固定數量值的容器類 以0開始的索引 陣列的元素帶編號,編號從0開始,如上圖中,元素6的位置1;而元素15的位置為0 元素的位

web框架 Cloud-Admin學習筆記ace-gate閘道器

Cloud-Admin專案裡的api閘道器專案是ace-gate,採用的是Spring Cloud Gateway元件,對外提供一個統一的api入口,並實現了api鑑權的功能。 從前端專案的配置裡可以看到,所有的api請求首先都轉到localhost:8765閘道器伺服器  

dsPIC33EBootloaderBootloader下位機

前面2節講述了dsPIC33E的Flash儲存結構以及Hex格式,接下來開始講述如何編寫Bootloader下位機和上位機。 本節講述下位機的設計,考慮到執行效率和燒錄時間,我們將主要解析工作放到上位機中,因為PC的執行速度遠高於MCU。在上位機中,我們將Hex檔案解析成一組一組的地址和資料

筆記儲存器

四、輔助儲存器 1.概述 輔助儲存器的特點   輔助儲存器作為主存的後援裝置又稱為外部儲存器,簡稱外存,它與主存一起組成了儲存器系統的主存-輔存層次。輔存具有容量大、速度慢、價格低、可離線儲存資訊等特點,屬“非易失性”儲存器。而主存具有速

數字影象處理之用影象增強談灰度變換

調整索引色影象的調色盤map。如果low_in, high_in, low_out, high_out 和 gamma 都是標量,那麼對 r,g,b 分量同時都做此對映。對於每個顏色分量都有唯一的對映,當 low_in 和 high_in 同時為1*3向量或者 low_out 和 high_out 同時為1

劍指Offer行榜牛客網練習

1、二進位制中1的個數 題目描述: 輸入一個整數,輸出該數二進位制表示中1的個數。其中負數用補碼錶示 程式碼: public class Solution { public int NumberOf1(int n) { String str = Integ

前端詞典繼承 - 面試官問的你都會嗎?

寫在前言前面的話 雖說標題是繼承,但繼承這塊的涉及的知識點不僅僅只是繼承,所以這塊我會分成兩個部分來講: 第一部分主講原型以及原型鏈 第二部分主講繼承的幾種方式 分兩節講有以下兩個原因: 需要了解繼承必須對原型和原型鏈有深刻的瞭解,分開講好消化 最近孩子快出生,需要更多的時間翻

Nginx-反向代理伺服器實踐篇之Tomcat+Nginx搭建叢集

繼前面的部落格,本篇部落格來實踐操作體會一下Nginx配置過程如下:(1)到Nginx官網下載Nginx的Windows版本:點選開啟連結(這裡我們使用nginx/Windows-1.4.7版本進行實驗

HTTPFiddler- Fiddler命令列和HTTP斷點除錯

一. Fiddler內建命令。 上一節(使用Fiddler進行抓包分析)中,介紹到,在web session(與我們通常所說的session不是同一個概念,這裡的每條HTTP請求都成為一個session)介面中可以看到Fiddler抓取的所有HTTP請求.而為了更加方便的管理所有的session, Fidd

Linux系統運維常見面試簡答題系列9題

connect 切換 -a ip) 整理 程序 strong ack 自己 1. 寫一個sed命令,修改/tmp/input.txt文件的內容,要求:(1) 刪除所有空行;(2) 一行中,如果包含”11111″,則在”11111″前面插入”AAA”,在”11111″後面插入

算法排序選擇排序

如何 接下來 運行時 images 復雜度 分析 穩定性 stat ima 在排序算法中,最簡單的莫過於選擇排序了。 排序思路: 在選擇排序算法中分別有一個外循環和一個內循環,假設需要排序的序列共有n個元素,所以外循環的次數為n次,在n次交換(外循環)中,每次設置序列中的第

算法排序冒泡排序

-m and 我們 sta image system ring ole bce 上一篇給大家說了選擇排序的原理,這一次我們來說一說冒泡排序的原理 其實冒泡排序和選擇排序一樣都是很簡單的排序方式。 本文將介紹以下內容 排序原理 算法實現(JAVA) 測試階段 算法分析