翻译

给定两个字符串s和t,决定它们是否是同构的。

假设s中的元素被替换能够得到t,那么称这两个字符串是同构的。

在用一个字符串的元素替换还有一个字符串的元素的过程中。所有字符的顺序必须保留。

没有两个字符能够被映射到同样的字符,但字符能够映射到该字符本身。

比如,
给定“egg”,“add”,返回真。
给定“foo”。“bar”,返回假。
给定“paper”,“title”,返回真。 批注:
你能够假设s和t有同样的长度。

原文

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.

分析

翻译完这题目就非常自然的想到一个方法,我希望将字符串所有输出成数字序列:

For example,

Given "paper", return "01023".

Given "foo", return "011".

Given "isomorphic", return "0123245607".

于是就将这个功能给实现了:

vector<int> getVecOrder(string str) {
map<char, int> strM;
int index = 0;
vector<int> strVec;
for (int i = 0; i < str.size(); ++i) {
auto iter = strM.find(str[i]);
if (iter == strM.end()) {
strM.insert(pair<char, int>(str[i], index));
strVec.push_back(index);
index += 1;
}
else {
strVec.push_back(strM[str[i]]);
}
}
return strVec;
}

这里用map来保存每一个字符和索引的键值对,索引用index来表示。索引从0開始。

最后的数字序列用vector来保存。

循环遍历整个字符串,每次在map中寻找一个字符,假设没有找到,则将其和相应的index加入进去,假设已经存在,就将该字符的索引从map中获取出来并加入到vector中。

有了这个模块函数,解起题来就轻而易举咯:

bool isIsomorphic(string s, string t) {
vector<int> v_s = getVecOrder(s), v_t = getVecOrder(t);
for (int i = 0; i < v_s.size(); ++i) {
if (v_s[i] != v_t[i]) return false;
}
return true;
}

由于字符串的长度题目说了是等长的,所以vector的长度肯定也是相等的了。

updated at 2016/09/05

同理,也能够改成例如以下所看到的的 Java 代码~

    private ArrayList getArrayOrder(String str) {
HashMap<Character, Integer> strM = new HashMap<>();
int index = 0;
ArrayList order = new ArrayList(str.length());
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if (strM.containsKey(c)) {
order.add(strM.get(c));
} else {
strM.put(c, index);
order.add(index);
index += 1;
}
}
return order;
} public boolean isIsomorphic(String s, String t) {
if (s.length() != t.length())
return false;
ArrayList s0 = getArrayOrder(s), t0 = getArrayOrder(t);
for (int i = 0; i < s0.size(); i++)
if (s0.get(i) != t0.get(i))
return false;
return true;
}

代码

class Solution {
public:
vector<int> getVecOrder(string str) {
int len = str.size();
map<char, int> strM;
int index = 0;
vector<int> strVec;
for (int i = 0; i < len; ++i) {
auto iter = strM.find(str[i]);
if (iter == strM.end()) {
strM.insert(pair<char, int>(str[i], index));
strVec.push_back(index);
index += 1;
}
else {
strVec.push_back(strM[str[i]]);
}
}
return strVec;
} bool isIsomorphic(string s, string t) {
vector<int> v_s = getVecOrder(s), v_t = getVecOrder(t);
for (int i = 0; i < v_s.size(); ++i) {
if (v_s[i] != v_t[i]) return false;
}
return true;
}
};

LeetCode 205 Isomorphic Strings(同构的字符串)(string、vector、map)(*)的更多相关文章

  1. [leetcode]205. Isomorphic Strings 同构字符串

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  2. [leetcode]205. Isomorphic Strings同构字符串

    哈希表可以用ASCII码数组来实现,可以更快 public boolean isIsomorphic(String s, String t) { /* 思路是记录下每个字符出现的位置,当有重复时,检查 ...

  3. LeetCode 205. Isomorphic Strings (同构字符串)

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  4. 205 Isomorphic Strings 同构字符串

    给定两个字符串 s 和 t,判断它们是否是同构的.如果 s 中的字符可以被替换最终变成 t ,则两个字符串是同构的.所有出现的字符都必须用另一个字符替换,同时保留字符的顺序.两个字符不能映射到同一个字 ...

  5. Leetcode 205 Isomorphic Strings 字符串处理

    判断两个字符串是否同构 hs,ht就是每个字符出现的顺序 "egg" 与"add"的数字都是122 "foo"是122, 而"ba ...

  6. LeetCode 205 Isomorphic Strings

    Problem: Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if ...

  7. [LeetCode] 205. Isomorphic Strings 解题思路 - Java

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  8. Java for LeetCode 205 Isomorphic Strings

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

  9. (easy)LeetCode 205.Isomorphic Strings (*)

    Given two strings s and t, determine if they are isomorphic. Two strings are isomorphic if the chara ...

随机推荐

  1. luogu2577 [ZJOI2005]午餐

    dp[i]表示第一队打饭时间i的最优解 #include <algorithm> #include <iostream> #include <cstring> #i ...

  2. [每日App一]QQ主题要逆天!轻轻松松月入30万!

    听从吾师秦刚(微信或QQ:1111884)酋长的建议,谋哥(微信viyi88)我开始新的征程,每日更新一篇干货文章(要坚持啊!否则被酋长鄙视了). 好了,废话不多说,今天我给大家揭秘一个你从来想也木有 ...

  3. Leetcode6--->Zigzag Conversion(将给定字符串按照Z字排列,输出结果)

    题目:给定一个字符串s,一个整数numRows, 将字符串s按照竖Z的方式排列,然后输出结果: 举例:String s = "PAYPALISHIRING"; 排列后为: P A ...

  4. Hibernate的简单封装Session(方便调用)

    因为每次用增删改查时都需要用到hibernate的配置来生成session工厂进而生成session,比较麻烦,所以我们直接封装一个可以调用的类,需要的时候只需要调用即可. 新建一个Hibernate ...

  5. iOS-----openGL--openGL ES iOS 入门篇--->搭建openGL环境

    OpenGL版本 iOS系统默认支持OpenGl ES1.0.ES2.0以及ES3.0 3个版本,三者之间并不是简单的版本升级,设计理念甚至完全不同,在开发OpenGL项目前,需要根据业务需求选择合适 ...

  6. 【Luogu】P1486郁闷的出纳员(Splay)

    题目链接 名副其实的调了一下午…… 每做一道题都是对我那不规范的Splay代码的刀刻斧凿一般的修正啊…… Splay.如果有一批员工不干了,那就找还能干的薪水最少的员工,把它splay到根,删除它的左 ...

  7. ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)

    问题 E: (ds:图)公路村村通 时间限制: 1 Sec  内存限制: 128 MB 提交: 9  解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...

  8. 具体knn算法概念参考knn代码python实现

    具体knn算法概念参考knn代码python实现上面是参考<机器学习实战>的代码,和knn的思想 # _*_ encoding=utf8 _*_ import numpy as npimp ...

  9. LibreOJ2045 - 「CQOI2016」密钥破解

    Portal Description 给出三个正整数\(e,N,c(\leq2^{62})\).已知\(N\)能表示成\(p\cdot q\)的形式,其中\(p,q\)为质数.计算\(r=(p-1)( ...

  10. python中的daemon守护进程实现方法

    原文参考:http://blog.csdn.net/tao_627/article/details/49532021 守护进程是生存期长的一种进程.它们独立于控制终端并且周期性的执行某种任务或等待处理 ...