题目:Isomorphic Strings
Given two strings s and t, determine if they are isomorphic.
Two strings are isomorphic if the characters in s can be replaced to get t.
All occurrences of a character must be replaced with another character while preserving the order of characters. No two characters may map to the same character but a character may map to itself.
For example,
Given “egg”, “add”, return true.Given “foo”, “bar”, return false.
Given “paper”, “title”, return true.
Note:
You may assume both s and t have the same length.
题目分析:
- 这道题目的含义是判断两个字符串是否为同构即类似于abb和cdd或者abcc和cadd
思路:
- 一开始自己理解的同构的思路是定义一个26长度的数组,存放字母出现的次数,然后将数组排序后对比就可以判断是否同构
这个想法的缺陷是abb和bab的结果是同构的,但是事实是不是同构的
更正思路:定义一个函数来将字符串更改为数字来替代例如abb用数字替换后为122;同理cdd用数字替换后也为122;那么即可判断两个字符串是同构的
代码:
- Javascript:[错误代码]
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isIsomorphic = function(s, t) {
s=s.toUpperCase();
t=t.toUpperCase();
var arr1=new Array(26);
var arr2=new Array(26);
for(var i=0;i<26;i++)
{
arr1[i]=0;
arr2[i]=0;
}
var arr3=s.split("");
var arr4=t.split("");
for(var i=0,l=arr3.length;i<l;i++)
{
var temp=arr3[i].charCodeAt()-65;//将字符对应的ASCII码的数组为加1
arr1[temp]++;
}
for(var i=0,l=arr4.length;i<l;i++)
{
var temp=arr4[i].charCodeAt()-65;
arr2[temp]++;
}
arr1=arr1.sort();//数组进行排序后如果两个数组相同,那么可以确定两个字符串是同构的
arr2=arr2.sort();
for(var i=0,l=arr1.length;i<l;i++)
{
if(arr1[i]!=arr2[i])
{
return false;
}
}
return true;
};
错误:原因是因为算法的结果aba和aab是同构的 其实是不同构的
- Javascript:[正确]
function replaceStrToNum(s)
{
var temp=0;
//申请一个大小为128的数组,并且数组的值为0
var arr= new Array(128);
for(var i=0;i<128;i++)
{
arr[i]=0;
}
var strarr=s.split("");//将字符串s每一位放到数组strarr中
for(var i=0,l=strarr.length;i<l;i++)
{
var a=strarr[i];
if(arr[a.charCodeAt()]==0)
{
arr[a.charCodeAt()] +=temp+"";
temp++;
}
strarr[i]=arr[a.charCodeAt()];
}
return strarr.join();//将数组连接成字符串
}
var isIsomorphic = function(s, t) {
if(s.length!=t.length)
{
return false;
}
if(replaceStrToNum(s)!=replaceStrToNum(t))
{
return false;
}
return true;
}
- C++:[正确]
class Solution {
public:
bool isIsomorphic(string s, string t) {
if(s.length()!=t.length())//如果s和t的字符长度不同那么肯定不同构
{
return false;
}
if(replaceStrToNum(s)!=replaceStrToNum(t))//如果s和t的字符串被转换后不相等,那么肯定不同构
{
return false;
}
return true;
}
string replaceStrToNum(string s){
char a[128]={0};//申请一个长度为128为的数组数组中值0
char tmp='0';//单引号表示单个字符 双引号表示字符串
for(int i=0,l=s.length();i<l;i++)
{
char b=s.at(i);//取出字符串s中index为i的单个字符
if(a[b]==0)
{
a[b]=tmp++;
}
s[i]=a[b];
}
return s;
}
};