同构体字符串(如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。 所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。)
示例 1:
输入: s = "egg",
t = "add"
输出: true
示例 2:
输入: s = "foo",
t = "bar"
输出: false
示例 3:
输入: s = "paper",
t = "title"
输出: true
说明:
你可以假设 s 和 t 具有相同的长度。
思路:定义并初始化count = 1,第一个字符通常我们记为1,后面出现不同的字符count依次累加,遇见相同的字符,我们找出前面相同字符所表示的数字添加。例如字符串s = "papper" 字符串t = "tittle" ,把s可表示为121134 t可表示为121134 在比较s和t是否相等,
代码如下:
public static boolean isIsomorphic(String s,String t) { //如果长度不相等直接返回false if(s.length() != s.length()) return false; //定义StringBuilder对象sb_s 和 sb_t StringBuilder sb_s = new StringBuilder(); StringBuilder sb_t = new StringBuilder(); //定义两个标记,从1开始,最大可以加到26,因为只有26个字符 int count_s = 1; int count_t = 1; //先对两个sb对象添加1,因为首字符不用做比较,它是同构的 sb_s.append(1); sb_t.append(1); //从下标1开始遍历遍历 for(int i = 1;i<s.length();i++) { //判断当前字符在前面字符串中的字符是否有相等的,相等返回前面相同字符的下标,不包含返回-1 int flag_s = isContainsCharacter(s.substring(0, i), s.charAt(i)); int flag_t = isContainsCharacter(t.substring(0, i), t.charAt(i)); //有相同字符,那么sb对象就添加之前相同字符下标在sb对象中对应的字符 (这块有点绕口) if(flag_s != -1) { sb_s.append(sb_s.charAt(flag_s)); }else { //没有相同字符,对标记先加1在加入sb对象中 sb_s.append(++count_s); } //有相同字符,那么sb对象就添加之前相同字符下标在sb对象中对应的字符 (这块有点绕口) if(flag_t != -1) { sb_t.append(sb_t.charAt(flag_t)); }else { //没有相同字符,对标记先加1在加入sb对象中 sb_t.append(++count_t); } } //比较两个sb对象是否相同,相同返回true,否则返回false return sb_s.toString().equals(sb_t.toString()); } //用于比较字符串是否包含字符,包含返回下标,不包含返回-1 public static int isContainsCharacter(String s,char c) { for(int i = 0;i<s.length();i++) { if(s.charAt(i) == c) return i; } return -1; }