Leetcode 第205题 Isomorphic Strings

题目: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;
    }
}; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值