Go Java算法之同構(gòu)字符串示例詳解
同構(gòu)字符串
給定兩個(gè)字符串 s 和 t ,判斷它們是否是同構(gòu)的。
如果 s 中的字符可以按某種映射關(guān)系替換得到 t ,那么這兩個(gè)字符串是同構(gòu)的。
每個(gè)出現(xiàn)的字符都應(yīng)當(dāng)映射到另一個(gè)字符,同時(shí)不改變字符的順序。不同字符不能映射到同一個(gè)字符上,相同字符只能映射到同一個(gè)字符上,字符可以映射到自己本身。
- 示例 1:
輸入:s = "egg", t = "add"
輸出:true
- 示例 2:
輸入:s = "foo", t = "bar"
輸出:false
- 示例 3:
輸入:s = "paper", t = "title"
輸出:true
提示:
1 <= s.length <= 5 * 104
t.length == s.length
s 和 t 由任意有效的 ASCII 字符組成
方法一:哈希表(Java)
此題需要我們判斷 s 和 t 每個(gè)位置上的字符是否都一一對(duì)應(yīng),即 s 的任意一個(gè)字符被 t 中唯一的字符對(duì)應(yīng),同時(shí) t 的任意一個(gè)字符被 s 中唯一的字符對(duì)應(yīng)。這也被稱(chēng)為「雙射」的關(guān)系。
以示例 2 為例,t 中的字符 a 和 r 雖然有唯一的映射 o,但對(duì)于 s 中的字符 o 來(lái)說(shuō)其存在兩個(gè)映射 {a,r},故不滿(mǎn)足條件。
因此,我們維護(hù)兩張哈希表,第一張哈希表 s2t 以 s 中字符為鍵,映射至 t 的字符為值,第二張哈希表 t2s 以 t 中字符為鍵,映射至 s 的字符為值。
class Solution {
public boolean isIsomorphic(String s, String t) {
Map<Character, Character> s2t = new HashMap<Character, Character>();
Map<Character, Character> t2s = new HashMap<Character, Character>();
int len = s.length();
for (int i = 0; i < len; ++i) {
char x = s.charAt(i), y = t.charAt(i);
if ((s2t.containsKey(x) && s2t.get(x) != y) || (t2s.containsKey(y) && t2s.get(y) != x)) {
return false;
}
s2t.put(x, y);
t2s.put(y, x);
}
return true;
}
}
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
方法一:哈希表(Go)
具體的方法思路已經(jīng)在上文中表述,具體詳情請(qǐng)看上文內(nèi)容。
方法思路:
- 定義兩個(gè)map容器用于存儲(chǔ)兩個(gè)字符串的映射關(guān)系map_s、map_t
- map_s:以 s 中字符為鍵,映射至 t 的字符為值
- map_t: 以 t 中字符為鍵,映射至 s 的字符為值
- 遍歷字符串(兩個(gè)字符串長(zhǎng)度相等同時(shí)遍歷)
- 不斷更新兩張哈希表,如果出現(xiàn)沖突時(shí)說(shuō)明兩個(gè)字符串無(wú)法構(gòu)成同構(gòu),返回 false。
- 沖突定義:即當(dāng)前下標(biāo) index 對(duì)應(yīng)的字符 map_s[index] 已經(jīng)存在映射且不為 t[index] 或當(dāng)前下標(biāo) index 對(duì)應(yīng)的字符map_t[index] 已經(jīng)存在映射且不為 s[index]也就是代碼中的if判斷條件
func isIsomorphic(s, t string) bool {
s2t := map[byte]byte{}
t2s := map[byte]byte{}
for i := range s {
x, y := s[i], t[i]
if s2t[x] > 0 && s2t[x] != y || t2s[y] > 0 && t2s[y] != x {
return false
}
s2t[x] = y
t2s[y] = x
}
return true
}
時(shí)間復(fù)雜度:O(N)
空間復(fù)雜度:O(1)
以上就是Go Java算法之同構(gòu)字符串示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Go Java算法同構(gòu)字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Golang中interface{}的注意事項(xiàng)
學(xué)習(xí)?golang?,對(duì)于?interface{}?接口類(lèi)型,我們一定繞不過(guò),這篇文章咱們就來(lái)一起來(lái)看看?使用?interface{}?的時(shí)候,都有哪些注意事項(xiàng)吧2023-03-03
golang跳轉(zhuǎn)語(yǔ)句goto,break,continue的使用及區(qū)別說(shuō)明
這篇文章主要介紹了golang跳轉(zhuǎn)語(yǔ)句goto,break,continue的使用及區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
Go語(yǔ)言實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù)詳解
這篇文章主要介紹了Go語(yǔ)言如何實(shí)現(xiàn)控制臺(tái)輸入&生成隨機(jī)數(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
node-exporter被檢測(cè)出來(lái)pprof調(diào)試信息泄露漏洞問(wèn)題
這篇文章主要介紹了node-exporter被檢測(cè)出來(lái)pprof調(diào)試信息泄露漏洞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04

