問(wèn)題:
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
Given "egg", "add", return true.
Given "foo", "bar", return false.
Given "paper", "title", return true.
Note:
You may assume both s and t have the same length.
大意:
給出兩個(gè)字符串s和t,判斷他們是不是同構(gòu)的垃帅。
如果s中的字母可以被t中的替換延届,就說(shuō)兩個(gè)字符串是同構(gòu)的。
所有出現(xiàn)的字母都必須被其他的字母以原來(lái)的順序去替換贸诚。兩個(gè)字母不同替換同一個(gè)字母方庭,但是一個(gè)字母可以替換他自己厕吉。
例子:
給出 “egg”,“add”械念,返回true头朱。
給出“foo”,“bar”龄减,返回faalse项钮。
給出“paper”,“title”希停,返回true烁巫。
注意:
你可以假設(shè)s和t的長(zhǎng)度是一樣的。
思路:
這道題的意思是把原來(lái)的字符串字母替換掉宠能,出現(xiàn)了幾次的字母亚隙,替換他的也要出現(xiàn)幾次,都要在原來(lái)的位置出現(xiàn)棍潘。
說(shuō)到字母還是想到用記數(shù)字的方式來(lái)判斷恃鞋,遍歷字符串記錄每個(gè)字母出現(xiàn)的次數(shù),因?yàn)闆](méi)說(shuō)只有小寫亦歉,所以記錄次數(shù)的數(shù)組容量要大一點(diǎn)恤浪,因?yàn)檎f(shuō)了兩個(gè)字符串長(zhǎng)度一樣淤堵,所以在一個(gè)循環(huán)里面遍歷就可以了憎妙。
記錄完后再遍歷一次字符串巧鸭,對(duì)兩個(gè)字符串中依次出現(xiàn)的對(duì)應(yīng)位置的字母判斷其出現(xiàn)次數(shù)是不是一樣的苇瓣。
不過(guò)還有一個(gè)問(wèn)題胀茵,提交時(shí)遇到一個(gè)測(cè)試用例為“abba”與“abab”逝嚎,這個(gè)用例中字母出現(xiàn)的次數(shù)是一樣的花椭,但是位置有點(diǎn)差異莹痢,要解決它呵恢,就得再創(chuàng)建兩個(gè)數(shù)組記錄兩個(gè)字符串中對(duì)應(yīng)字母出現(xiàn)的位置的序號(hào)之和鞠值,只有對(duì)應(yīng)字母出現(xiàn)的位置序號(hào)的和也是一樣的,才能保證是完全同構(gòu)的渗钉。
代碼(Java):
public class Solution {
public boolean isIsomorphic(String s, String t) {
int[] sNum = new int[128];
int[] sPosition = new int[128];
int[] tNum = new int[128];
int[] tPosition = new int[128];
for (int i = 0; i < s.length(); i++) {
sNum[s.charAt(i)]++;
sPosition[s.charAt(i)] += i;
tNum[t.charAt(i)]++;
tPosition[t.charAt(i)] += i;
}
for (int i = 0; i < s.length(); i++) {
if (sNum[s.charAt(i)] != tNum[t.charAt(i)]) return false;
if (sPosition[s.charAt(i)] != tPosition[t.charAt(i)]) return false;
}
return true;
}
}
合集:https://github.com/Cloudox/LeetCode-Record