Ambigram Detection- Google Top Interview Questions


Problem Statement :


You are given a lowercase alphabet string s and a two-dimensional list of strings pairs.
 Each element in pairs contains [a, b] meaning that character a and b are considered equivalent. 
We say that if a and b are equivalent and b and c are equivalent, then a and c are also equivalent. 
Also, any character a is equivalent to itself.

Return whether s is a palindrome given the equivalence relations.

Constraints

0 ≤ n ≤ 100,000 where n is the length of s

0 ≤ p ≤ 100,000 where p is the length of p

Example 1

Input

s = "acba"

pairs = [

    ["b", "c"]

]

Output

True

Explanation

Since "b" = "c", we have "acba" = "acca", which is a palindrome.



Example 2

Input

s = "zz"

pairs = []

Output

True

Explanation

"z" is equivalent to itself.



Example 3

Input

s = "ac"

pairs = [

    ["a", "b"],

    ["b", "c"]

]

Output

True

Explanation

Since "a" = "c", we have "ac" = "cc", which is a palindrome.



Solution :



title-img




                        Solution in C++ :

bool solve(string s, vector<vector<string>>& pairs) {
    vector<int> parent(26);
    iota(parent.begin(), parent.end(), 0);

    function<int(int)> find = [&](int x) {
        return parent[x] == x ? x : parent[x] = find(parent[x]);
    };
    auto join = [&](int a, int b) { parent[find(a)] = parent[find(b)]; };

    for (auto& p : pairs) {
        int a = p[0][0] - 'a';
        int b = p[1][0] - 'a';
        join(a, b);
    }
    for (char& c : s) {
        int i = c - 'a';
        c = find(i) + 'a';
    }
    int i = 0, j = (int)s.size() - 1;
    while (i < j) {
        if (s[i] ^ s[j]) return false;
        i++, j--;
    }
    return true;
}
                    


                        Solution in Java :

import java.util.*;

class Solution {
    public boolean solve(String s, String[][] pairs) {
        DisjointSetUnion dsu = new DisjointSetUnion(26);
        for (String[] p : pairs) {
            int a = p[0].charAt(0) - 'a';
            int b = p[1].charAt(0) - 'a';
            dsu.connect(a, b);
        }
        for (int i = 0; i < s.length(); i++) {
            int j = s.length() - 1 - i;
            int a = s.charAt(i) - 'a';
            int b = s.charAt(j) - 'a';
            if (!dsu.connected(a, b))
                return false;
        }
        return true;
    }

    static class DisjointSetUnion {
        public int[] parent;
        public int[] weight;
        public int count;

        public DisjointSetUnion(int N) {
            count = N;
            parent = new int[N];
            for (int i = 0; i < N; i++) parent[i] = i;
            weight = new int[N];
            Arrays.fill(weight, 1);
        }

        //"find"
        public int root(int p) {
            if (p == parent[p])
                return p;
            return parent[p] = root(parent[p]);
        }

        //"union"
        public void connect(int p, int q) {
            p = root(p);
            q = root(q);
            if (p == q)
                return;
            if (weight[p] < weight[q]) {
                parent[p] = q;
                weight[q] += weight[p];
            } else {
                parent[q] = p;
                weight[p] += weight[q];
            }
            count--;
        }

        public boolean connected(int p, int q) {
            return root(p) == root(q);
        }
    }
}
                    


                        Solution in Python : 
                            
class Solution:
    def solve(self, s, pairs):
        parent = {}
        for c in s:
            parent[c] = c

        def find(c):
            if c not in parent or parent[c] == c:
                return c
            parent[c] = find(parent[c])
            return parent[c]

        def union(a, b):
            a = find(a)
            b = find(b)
            if a != b:
                parent[b] = a

        for s1, e1 in pairs:
            union(s1, e1)

        s = [find(x) for x in s]

        return s == s[::-1]
                    


View More Similar Problems

2D Array-DS

Given a 6*6 2D Array, arr: 1 1 1 0 0 0 0 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 An hourglass in A is a subset of values with indices falling in this pattern in arr's graphical representation: a b c d e f g There are 16 hourglasses in arr. An hourglass sum is the sum of an hourglass' values. Calculate the hourglass sum for every hourglass in arr, then print t

View Solution →

Dynamic Array

Create a list, seqList, of n empty sequences, where each sequence is indexed from 0 to n-1. The elements within each of the n sequences also use 0-indexing. Create an integer, lastAnswer, and initialize it to 0. There are 2 types of queries that can be performed on the list of sequences: 1. Query: 1 x y a. Find the sequence, seq, at index ((x xor lastAnswer)%n) in seqList.

View Solution →

Left Rotation

A left rotation operation on an array of size n shifts each of the array's elements 1 unit to the left. Given an integer, d, rotate the array that many steps left and return the result. Example: d=2 arr=[1,2,3,4,5] After 2 rotations, arr'=[3,4,5,1,2]. Function Description: Complete the rotateLeft function in the editor below. rotateLeft has the following parameters: 1. int d

View Solution →

Sparse Arrays

There is a collection of input strings and a collection of query strings. For each query string, determine how many times it occurs in the list of input strings. Return an array of the results. Example: strings=['ab', 'ab', 'abc'] queries=['ab', 'abc', 'bc'] There are instances of 'ab', 1 of 'abc' and 0 of 'bc'. For each query, add an element to the return array, results=[2,1,0]. Fun

View Solution →

Array Manipulation

Starting with a 1-indexed array of zeros and a list of operations, for each operation add a value to each of the array element between two given indices, inclusive. Once all operations have been performed, return the maximum value in the array. Example: n=10 queries=[[1,5,3], [4,8,7], [6,9,1]] Queries are interpreted as follows: a b k 1 5 3 4 8 7 6 9 1 Add the valu

View Solution →

Print the Elements of a Linked List

This is an to practice traversing a linked list. Given a pointer to the head node of a linked list, print each node's data element, one per line. If the head pointer is null (indicating the list is empty), there is nothing to print. Function Description: Complete the printLinkedList function in the editor below. printLinkedList has the following parameter(s): 1.SinglyLinkedListNode

View Solution →