205. Isomorphic Strings

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

Two strings s and t 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.

 

Example 1:

Input: s = "egg", t = "add"
Output: true

Example 2:

Input: s = "foo", t = "bar"
Output: false

Example 3:

Input: s = "paper", t = "title"
Output: true

 

Constraints:

  • 1 <= s.length <= 5 * 104
  • t.length == s.length
  • s and t consist of any valid ascii character.

Rust Solution

struct Solution;

use std::collections::HashMap;

impl Solution {
    fn is_isomorphic(s: String, t: String) -> bool {
        let mut hmst: HashMap<char, char> = HashMap::new();
        let mut hmts: HashMap<char, char> = HashMap::new();
        let mut is = s.chars();
        let mut it = t.chars();
        while let (Some(cs), Some(ct)) = (is.next(), it.next()) {
            if let Some(&vt) = hmst.get(&cs) {
                if vt != ct {
                    return false;
                }
            } else {
                hmst.insert(cs, ct);
            }
            if let Some(&vs) = hmts.get(&ct) {
                if vs != cs {
                    return false;
                }
            } else {
                hmts.insert(ct, cs);
            }
        }
        true
    }
}

#[test]
fn test() {
    let s = "egg".to_string();
    let t = "add".to_string();
    assert_eq!(Solution::is_isomorphic(s, t), true);
    let s = "foo".to_string();
    let t = "bar".to_string();
    assert_eq!(Solution::is_isomorphic(s, t), false);
    let s = "paper".to_string();
    let t = "title".to_string();
    assert_eq!(Solution::is_isomorphic(s, t), true);
}

Having problems with this solution? Click here to submit an issue on github.