2 minutes
Week1025_algorithm
ARTS - Algorithm 补12.24
205. 同构字符串
题目
给定两个字符串 s 和 t,判断它们是否是同构的。
如果 s 中的字符可以被替换得到 t ,那么这两个字符串是同构的。
所有出现的字符都必须用另一个字符替换,同时保留字符的顺序。两个字符不能映射到同一个字符上,但字符可以映射自己本身。
示例 1:
输入: s = “egg”, t = “add” 输出: true 示例 2:
输入: s = “foo”, t = “bar” 输出: false 示例 3:
输入: s = “paper”, t = “title” 输出: true 说明: 你可以假设 s 和 t 具有相同的长度。
分析
找相同结构的字符串,那么,可以把字符串转换为数字,比如第一个1开始,如果和之前的字符有重复,就设置为相同的数字,如果不是,就把前一个加1.
那么代码如下:
public static boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) {
return false;
}
String r1 = convert(s);
String r2 = convert(t);
return Objects.equals(r1, r2);
}
private static String convert(String s) {
int idx = 1;
StringBuilder sb = new StringBuilder();
sb.append(idx);
for (int i = 1; i < s.length(); i++) {
char ch1 = s.charAt(i);
boolean flag = false;
for (int j = 0; j < i; j++) {
char ch2 = s.charAt(j);
if (ch2 == ch1) {
flag = true;
sb.append(sb.charAt(j));
break;
}
}
if (!flag) {
sb.append(++idx);
}
}
return sb.toString();
}
这个解法能通过,但是不是最优解法,耗费内存多且效率都不高,我们想办法优化这个。
代码
以下使用了codepoint来进行比较的。
public boolean isIsomorphic(String s, String t) {
if (s.length() != t.length()) {
return false;
}
int MAXCHAR = 256;
char maps[] = new char[MAXCHAR];
char mapt[] = new char[MAXCHAR];
for (int i = 0; i < s.length(); i++) {
if (maps[s.charAt(i)] == 0 && mapt[t.charAt(i)] == 0) {
maps[s.charAt(i)] = t.charAt(i);
mapt[t.charAt(i)] = s.charAt(i);
continue;
}
if (maps[s.charAt(i)] == t.charAt(i) && mapt[t.charAt(i)] == s.charAt(i)) {
continue;
}
return false;
}
return true;
}
Read other posts