Leetcode_205_Isomorphic Strings


この文章は学習中のまとめです。転載を歓迎しますが、出典を明記してください。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  "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());
	}
}