class Solution {
public boolean isIsomorphic(String s, String t) {
Map<String,Integer> sMap = new HashMap<>();
Map<String,Integer> tMap = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
String sString = s.substring(i,i + 1);
String tString = t.substring(i,i + 1);
if (sMap.get(sString) ==null && tMap.get(tString) == null) {
sMap.put(sString,i);
tMap.put(tString,i);
continue;
}
if((sMap.get(sString) ==null && tMap.get(tString) != null) || (sMap.get(sString) != null && tMap.get(tString) == null)) {
return false;
}
if (!sMap.put(sString,i).equals(tMap.put(tString,i))) {
return false;
}
}
return true;
}
}
直接一个map,如果key存在就查找和当前的比较,不存在就插入map
因为字母只有26个,用一个数组就可以,不用map
我手上没有java,用C#写一个给你,思路一样,你自己修改成java的
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Q693096
{
class Program
{
static void Main(string[] args)
{
string[] ss = { "egg", "foo", "paper" };
string[] ts = { "add", "bar", "title" };
for (int i = 0; i < ss.Length; i++)
{
Console.WriteLine("s={0}, t={1}, result={2}", ss[i], ts[i], isIsomorphic(ss[i], ts[i]));
}
}
static public bool isIsomorphic(string s, string t)
{
s = s.ToLower();
t = t.ToLower(); //如果可以假设s t都是小写,这两行可以删除
char[] arr = new char[26];
for (int i = 0; i < 26; i++) arr[i] = '#';
for (int i = 0; i < s.Length; i++)
{
if (arr[s[i] - 'a'] != '#')
{
if (arr[s[i] - 'a'] != t[i])
return false;
}
else
{
for (int j = 0; j < 26; j++)
if (arr[j] == t[i])
return false;
arr[s[i] - 'a'] = t[i];
}
}
return true;
}
}
}
s=egg, t=add, result=True
s=foo, t=bar, result=False
s=paper, t=title, result=True
Press any key to continue . . .
需要注意一个问题,我不是很理解题目
比如
egg->aaa
这个应该返回true还是false,题目不是很明确。
因为所有的e和所有的g都替换成a的话,可以从egg得到aaa,但是反过来不行。
如果这个是true,那么注释
//for (int j = 0; j < 26; j++)
// if (arr[j] == t[i])
// return false;
否则保留。
应该是判断两个字符串的结构是否相同吧。 我这样写应该是简化了很多
public static boolean isIsomorphic(String s, String t) {
boolean flag = false;
if(s.length() == t.length()){
char[] sArray = s.toCharArray();
char[] tArray = t.toCharArray();
for(int j=0;j<sArray.length;j++){
int sCount = s.replaceAll("[^"+sArray[j]+"]", "").length();
int tCount = t.replaceAll("[^"+tArray[j]+"]", "").length();
if(sCount == tCount){
if(sCount>=2)flag = true;
}else{
flag = false;
break;
}
}
}
return flag;
}
这个问题很简单的啊,开个26的数组,分别扫描两个字符串中每个字母的出现次数,然后再扫一遍这个数组,统计数组中每个元素的出现频率是否是一样的。
举个例子:
egg e出现1次,g出现2次,其他字母出现0次。因此出现0次的字母有24个,出现1次的有1个,出现2次的有1个。
add a出现1次,d出现2次,其他字母出现0次。因此出现0次的字母有24个,出现1次的有1个,出现2次的有1个。
所以这两个字符串能够转换。
bar 出现0次的字母有23个,出现1次的有3个。
foo 出现0次的字母有24个,出现1次的有1个,出现两次的有1个。
所以这两个不能转换。