Leetcode_205_Isomorphic Strings
2820 ワード
この文章は学習中のまとめです。転載を歓迎しますが、出典を明記してください。http://blog.csdn.net/pistolove/article/details/46530865
Given two stings s and t,determine if they are isomorphic.
Two stings are isomorphic if the characters in s can be replacced to get t.
All occurrences of a character must be replacced with another character while preserving the order of characters.No two characters map to the same character but a character may map to itelf.
For example,Given
Given
Given
考え方:
(1)与えられた2つの長さの同じ文字列を意味し、この2つの文字列の同じ文字位置に対応するかどうかを判断します。
(2)同じ文字の位置が対応しているかどうかを判断するには、全文字の位置を記録する必要があります。まず、2つの異なるMapを作成して、それぞれ2つの文字列に関する情報を保存します。ここでkeyは文字列の中の文字で、valueは文字列の中の下付き文字です。例えば、e g gとa d dの保存形式はそれぞれ{1}、g={23}}、a={1}、d={23}です。第二に、文字配列の各文字を遍歴するだけで、Mapに対応するkeyに現在巡回している文字が含まれていない場合、その文字とその位置をMapに保存します。そうでない場合、Mapから現在の文字に対応するvalueを取り出して、現在の文字位置をvalueに追加します。最後に、文字配列を巡回した後、二つのMapが対応するvalueサイズが同じかどうかを判断し、異なるならfalseに戻ります。そうでなければ、二つのMapのvalue値を二つの新しいSteringBufferに順次入れます。最後に得られた文字列の内容が同じであれば、trueに戻ります。そうでなければfalseに戻ります。例えば、eggとaddが最後に得た文字列は全部「123」であり、pickとgoodが対応するMapは{p={1}、i={2}、c={3}、k={4}と{g={1}、o={23}、d={4}}であり、明らかに2つのMavaluseが対応しているので、サイズが異なる。
(3)詳細は下のコードになります。この文章があなたの役に立ちますように。
アルゴリズムコードは以下の通り実現される。
Given two stings s and t,determine if they are isomorphic.
Two stings are isomorphic if the characters in s can be replacced to get t.
All occurrences of a character must be replacced with another character while preserving the order of characters.No two characters map to the same character but a character may map to itelf.
For example,Given
"egg"
、 "add"
,return true.Given
"foo"
、 "bar"
,return false.Given
"paper"
、 "title"
,return true.考え方:
(1)与えられた2つの長さの同じ文字列を意味し、この2つの文字列の同じ文字位置に対応するかどうかを判断します。
(2)同じ文字の位置が対応しているかどうかを判断するには、全文字の位置を記録する必要があります。まず、2つの異なるMapを作成して、それぞれ2つの文字列に関する情報を保存します。ここでkeyは文字列の中の文字で、valueは文字列の中の下付き文字です。例えば、e g gとa d dの保存形式はそれぞれ{1}、g={23}}、a={1}、d={23}です。第二に、文字配列の各文字を遍歴するだけで、Mapに対応するkeyに現在巡回している文字が含まれていない場合、その文字とその位置をMapに保存します。そうでない場合、Mapから現在の文字に対応するvalueを取り出して、現在の文字位置をvalueに追加します。最後に、文字配列を巡回した後、二つのMapが対応するvalueサイズが同じかどうかを判断し、異なるならfalseに戻ります。そうでなければ、二つのMapのvalue値を二つの新しいSteringBufferに順次入れます。最後に得られた文字列の内容が同じであれば、trueに戻ります。そうでなければfalseに戻ります。例えば、eggとaddが最後に得た文字列は全部「123」であり、pickとgoodが対応するMapは{p={1}、i={2}、c={3}、k={4}と{g={1}、o={23}、d={4}}であり、明らかに2つのMavaluseが対応しているので、サイズが異なる。
(3)詳細は下のコードになります。この文章があなたの役に立ちますように。
アルゴリズムコードは以下の通り実現される。
package leetcode;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
/**
*
* @author liqq
*
*/
public class Isomorphic_Strings {
public static boolean isIsomorphic(String s, String t) {
char[] ch1 = s.toCharArray();
char[] ch2 = t.toCharArray();
int len = ch1.length;
Map _map1 = new LinkedHashMap();
Map _map2 = new LinkedHashMap();
for (int i = 0; i < len; i++) {
if(_map1.get(ch1[i])==null){
_map1.put(ch1[i], new StringBuffer());
_map1.get(ch1[i]).append(i);
}else{
_map1.get(ch1[i]).append(i);
}
if(_map2.get(ch2[i])==null){
_map2.put(ch2[i], new StringBuffer());
_map2.get(ch2[i]).append(i);
}else{
_map2.get(ch2[i]).append(i);
}
if(_map1.values().size()!=_map2.values().size()){
return false;
}
}
StringBuffer b1 = new StringBuffer();
StringBuffer b2 = new StringBuffer();
for (Iterator iterator1 = _map1.values().iterator(),iterator2 = _map2.values().iterator();
iterator1.hasNext()&&iterator2.hasNext();) {
b1.append(iterator1.next());
b2.append(iterator2.next());
}
return b1.toString().equals(b2.toString());
}
}