[LeetCode] 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.

解题方法:
        该题意是判断两个字符串s和t是否是同构的。(注意字符不仅是字母)
        最简单的方法是通过计算每个字符出现的个数并且相应位置字母对应,但是两层循环肯定TLE。所以需要通过O(n)时间比较,采用的方法是:
        eg: "aba" <> "baa"  return false
        关键代码:nums[s[i]]=t[i]  numt[t[i]]=s[i] 再比较是否相同 
        nums['a']='b' numt['b']='a'  (第一次出现)
        nums['b']='a' numt['a']='b'  (第一次出现)
        nums['a']='b' <> t[2]='a'     (第二次出现)  return false
        该方法技巧性比较强,当然如果你使用C++的映射就非常容易实现了。

我的代码:

bool isIsomorphic(char* s, char* t) {
    int ls,lt;     //字符串长度
    int i,j;
    int nums[256]={0};
    int numt[256]={0};

    ls = strlen(s);
    lt = strlen(t);
    if(ls!=lt) return false;
    for(i=0; i<ls; i++) {
        //初值为0
        if(nums[s[i]]==0) {
            if(numt[t[i]]==0) {
                nums[s[i]] = t[i];
                numt[t[i]] = s[i];
            }
            else {
                return false;
            }
        }
        else {
            if(nums[s[i]]!=t[i]) {
                return false;
            }
        }
    }
    return true;
}

C++推荐代码:

        参考:http://www.cnblogs.com/easonliu/p/4465650.html
        题目很简单,也很容易想到方法,就是记录遍历s的每一个字母,并且记录s[i]到t[i]的映射,当发现与已有的映射不同时,说明无法同构,直接return false。但是这样只能保证从s到t的映射,不能保证从t到s的映射,所以交换s与t的位置再重来一遍上述的遍历就OK了。

class Solution {
public:
    bool isIsomorphic(string s, string t) {
        if (s.length() != t.length()) return false;
        map<char, char> mp;
        for (int i = 0; i < s.length(); ++i) {
            if (mp.find(s[i]) == mp.end()) mp[s[i]] = t[i];
            else if (mp[s[i]] != t[i]) return false;
        }
        mp.clear();
        for (int i = 0; i < s.length(); ++i) {
            if (mp.find(t[i]) == mp.end()) mp[t[i]] = s[i];
            else if (mp[t[i]] != s[i]) return false;
        }
        return true;
    }
};

(By:Eastmount 2015-9-21 凌晨1点半   http://blog.csdn.net/eastmount/)

时间: 2024-10-21 11:08:21

[LeetCode] Isomorphic Strings - 字符串操作:数组计数字符个数问题的相关文章

[LeetCode] 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.

编写PHP程序检查字符串中的中文字符个数的实例分享_php实例

有时候我们需要计算一个字符串中包含的字数,对于纯英文字符串,字数等于字符串长度,用 strlen函数即可获得,但如果字符串中包含中文怎办?mb_strlen可以实现,但不幸没装扩展,那就自己实现一下吧. php有一个扩展一般是必装的,我们可以使用mb_strlen来获取字符串中的字数,用法一般如下: $len = mb_strlen("你是我的小苹果","utf-8"); 如愿获得字符串长度:7. 如果没装mb扩展呢?自己实现一下吧. 我们要先明白一个事实:字符串是

PHP开发中常用的字符串操作函数

1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行定义,这样做是比较有好处的. 2,替换字符串 在PHP这门语言中,提供了一个名字叫做substr_replace()的函数,该函数的作用可以快速的完成扫描和编辑文本内容较多的字符串替换功能.他的语法格式: mixed substr_replace(mixed $string,string $repl

PHP开发中常用的字符串操作函数_php技巧

1,拼接字符串 拼接字符串是最常用到的字符串操作之一,在PHP中支持三种方式对字符串进行拼接操作,分别是圆点.分隔符{}操作,还有圆点等号.=来进行操作,圆点等号可以把一个比较长的字符串分解为几行进行定义,这样做是比较有好处的. 2,替换字符串 在PHP这门语言中,提供了一个名字叫做substr_replace()的函数,该函数的作用可以快速的完成扫描和编辑文本内容较多的字符串替换功能.他的语法格式: mixed substr_replace(mixed $string,string $repl

有关UNICODE、ANSI字符集和相关字符串操作

Q UNICODE字符串如何显示 A 如果程序定义了_UNICODE宏直接用 WCHAR *str=L"unicodestring"; TextOut(0,0,str); 否则就需要转换类型 #include <comdef.h> WCHAR *str=L"unicodestring"; bstr_t str1=str; TextOut(0,0,(char*)str1); Q 如何实现ANSI和UNICODE的相互转换 A 将ANSI转换到Unicode

JS数组操作(数组增加、删除、翻转、转字符串、取索引、截取(切片)slice、剪接splice、数组合并)_javascript技巧

POP 删除最后一项 删除最后一项,并返回删除元素的值:如果数组为空则返回undefine var a = [1,2,3,4,5]; a.pop();//a:[1, 2, 3, 4] a.pop();//a:[1, 2, 3] a.pop();//a:[1, 2] shift 删除第一项 删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefine var a = [1,2,3,4,5]; a.shift(); //a:[2,3,4,5] a.shift(); //a:[3, 4,

从字符串中取一个字符作为数组元素

从字符串中取一个字符作为数组元素 public class mainclass {   public static void main(string[] arg) {     string text = "to be or not to be";        // define a string     byte[] textarray = text.getbytes();         for(byte b: textarray){       system.out.printl

&amp;#106avascript中的字符串操作

字符串 一.概述    字符串在javascript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更多....JavaScript的核心部分提供了一组属性和方法用于通用的字符串操作,如分割字符串,改变字符串的大小写,操作子字符串等.    当前的大部分浏览器也能从强大的正则表达式获益,因为它极大地简化了大量的字符串操作任务,不过它也需要你克服一条有些陡峭的学习曲线.在这里,主要是介绍字符串本身的一些操作,正则表达式会在以后的随笔中涉及

JavaScript中的字符串操作

javascript|字符串 一.概述    字符串在JavaScript中几乎无处不在,在你处理用户的输入数据的时候,在读取或设置DOM对象的属性时,在操作cookie时,当然还有更多....JavaScript的核心部分提供了一组属性和方法用于通用的字符串操作,如分割字符串,改变字符串的大小写,操作子字符串等.    当前的大部分浏览器也能从强大的正则表达式获益,因为它极大地简化了大量的字符串操作任务,不过它也需要你克服一条有些陡峭的学习曲线.在这里,主要是介绍字符串本身的一些操作,正则表达