Cuente los Nodes de un árbol cuya string ponderada no contiene ningún carácter duplicado

Dado un árbol y los pesos (en forma de strings) de todos los Nodes, la tarea es contar los Nodes cuyos pesos no contienen ningún carácter duplicado.
Ejemplos: 
 

Aporte: 
 

Salida:
Solo las strings de los Nodes 1 y 4 contienen strings únicas. 
 

Enfoque: Realice dfs en el árbol y para cada Node, verifique si su string contiene caracteres duplicados o no. De lo contrario, incremente el conteo.
A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
int cnt = 0;
 
vector<int> graph[100];
vector<string> weight(100);
 
// Function that returns true if the
// string contains unique characters
bool uniqueChars(string x)
{
    map<char, int> mp;
    int n = x.size();
 
    for (int i = 0; i < n; i++)
        mp[x[i]]++;
    if (mp.size() == x.size())
        return true;
    else
        return false;
}
 
// Function to perform dfs
void dfs(int node, int parent)
{
    // If weighted string of the current
    // node contains unique characters
    if (uniqueChars(weight[node]))
        cnt += 1;
 
    for (int to : graph[node]) {
        if (to == parent)
            continue;
        dfs(to, node);
    }
}
 
// Driver code
int main()
{
 
    // Weights of the nodes
    weight[1] = "abc";
    weight[2] = "aba";
    weight[3] = "bcb";
    weight[4] = "moh";
    weight[5] = "aa";
 
    // Edges of the tree
    graph[1].push_back(2);
    graph[2].push_back(3);
    graph[2].push_back(4);
    graph[1].push_back(5);
 
    dfs(1, 1);
 
    cout << cnt;
 
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
 
class GFG
{
 
    static int cnt = 0;
 
    static Vector<Integer>[] graph = new Vector[100];
    static String[] weight = new String[100];
 
    // Function that returns true if the
    // String contains unique characters
    static boolean uniqueChars(char[] arr)
    {
        HashMap<Character, Integer> mp =
        new HashMap<Character, Integer>();
        int n = arr.length;
 
        for (int i = 0; i < n; i++)
            if (mp.containsKey(arr[i]))
            {
                mp.put(arr[i], mp.get(arr[i]) + 1);
            }
            else
            {
                mp.put(arr[i], 1);
            }
        if (mp.size() == arr.length)
            return true;
        else
            return false;
    }
 
    // Function to perform dfs
    static void dfs(int node, int parent)
    {
        // If weighted String of the current
        // node contains unique characters
        if (uniqueChars(weight[node].toCharArray()))
            cnt += 1;
 
        for (int to : graph[node])
        {
            if (to == parent)
                continue;
            dfs(to, node);
        }
    }
 
    // Driver code
    public static void main(String[] args)
    {
 
        for (int i = 0; i < 100; i++)
            graph[i] = new Vector<Integer>();
         
        // Weights of the nodes
        weight[1] = "abc";
        weight[2] = "aba";
        weight[3] = "bcb";
        weight[4] = "moh";
        weight[5] = "aa";
 
        // Edges of the tree
        graph[1].add(2);
        graph[2].add(3);
        graph[2].add(4);
        graph[1].add(5);
 
        dfs(1, 1);
 
        System.out.print(cnt);
    }
}
 
// This code is contributed by Rajput-Ji

Python3

# Python3 implementation of the approach
cnt = 0
 
graph = [[] for i in range(100)]
weight = [0] * 100
 
# Function that returns true if the
# string contains unique characters
def uniqueChars(x):
    mp = {}
    n = len(x)
    for i in range(n):
        if x[i] not in mp:
            mp[x[i]] = 0
        mp[x[i]] += 1
    if (len(mp) == len(x)):
        return True
    else:
        return False
 
# Function to perform dfs
def dfs(node, parent):
    global cnt, x
     
    # If weight of the current node
    # node contains unique characters
    if (uniqueChars(weight[node])):
        cnt += 1
    for to in graph[node]:
        if (to == parent):
            continue
        dfs(to, node)
 
# Driver code
x = 5
 
# Weights of the node
weight[1] = "abc"
weight[2] = "aba"
weight[3] = "bcb"
weight[4] = "moh"
weight[5] = "aa"
 
# Edges of the tree
graph[1].append(2)
graph[2].append(3)
graph[2].append(4)
graph[1].append(5)
 
dfs(1, 1)
print(cnt)
 
# This code is contributed by SHUBHAMSINGH10

C#

// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
    static int cnt = 0;
 
    static List<int>[] graph = new List<int>[100];
    static String[] weight = new String[100];
 
    // Function that returns true if the
    // String contains unique characters
    static bool uniqueChars(char[] arr)
    {
        Dictionary<char, int> mp =
        new Dictionary<char, int>();
        int n = arr.Length;
 
        for (int i = 0; i < n; i++)
            if (mp.ContainsKey(arr[i]))
            {
                mp[arr[i]] = mp[arr[i]] + 1;
            }
            else
            {
                mp.Add(arr[i], 1);
            }
        if (mp.Count == arr.Length)
            return true;
        else
            return false;
    }
 
    // Function to perform dfs
    static void dfs(int node, int parent)
    {
        // If weighted String of the current
        // node contains unique characters
        if (uniqueChars(weight[node].ToCharArray()))
            cnt += 1;
 
        foreach (int to in graph[node])
        {
            if (to == parent)
                continue;
            dfs(to, node);
        }
    }
 
    // Driver code
    public static void Main(String[] args)
    {
 
        for (int i = 0; i < 100; i++)
            graph[i] = new List<int>();
         
        // Weights of the nodes
        weight[1] = "abc";
        weight[2] = "aba";
        weight[3] = "bcb";
        weight[4] = "moh";
        weight[5] = "aa";
 
        // Edges of the tree
        graph[1].Add(2);
        graph[2].Add(3);
        graph[2].Add(4);
        graph[1].Add(5);
 
        dfs(1, 1);
 
        Console.Write(cnt);
    }
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// JavaScript implementation of the approach
 
let cnt = 0;
 
let graph = new Array();
for (let i = 0; i < 100; i++) {
    graph.push([])
}
 
let weight = new Array(100);
 
// Function that returns true if the
// string contains unique characters
function uniqueChars(x) {
    let mp = new Map();
    let n = x.length;
 
    for (let i = 0; i < n; i++) {
        if (mp.has(x[i])) {
            mp.set(x[i], mp.get(x[i]) + 1)
        } else {
            mp.set(x[i], 1)
        }
    }
    if (mp.size == x.length)
        return true;
    else
        return false;
}
 
// Function to perform dfs
function dfs(node, parent) {
    // If weighted string of the current
    // node contains unique characters
    if (uniqueChars(weight[node]))
        cnt += 1;
 
    for (let to of graph[node]) {
        if (to == parent)
            continue;
        dfs(to, node);
    }
}
 
// Driver code
 
// Weights of the nodes
weight[1] = "abc";
weight[2] = "aba";
weight[3] = "bcb";
weight[4] = "moh";
weight[5] = "aa";
 
// Edges of the tree
graph[1].push(2);
graph[2].push(3);
graph[2].push(4);
graph[1].push(5);
 
dfs(1, 1);
 
document.write(cnt);
 
// This code is contributed by _saurabh_jaiswal
 
</script>
Producción: 

2

 

Análisis de Complejidad: 
 

  • Complejidad de tiempo: O(N*Len) donde Len es la longitud máxima de la string ponderada de un Node en el árbol dado. 
    En dfs, cada Node del árbol se procesa una vez y, por lo tanto, la complejidad debida a dfs es O(N) si hay un total de N Nodes en el árbol. Además, el procesamiento de cada Node implica atravesar la string ponderada de ese Node, lo que agrega una complejidad de O (Len) donde Len es la longitud de la string ponderada. Por lo tanto, la complejidad del tiempo es O(N*Len).
  • Espacio Auxiliar: O(1). 
    No se requiere ningún espacio adicional, por lo que la complejidad del espacio es constante.

Publicación traducida automáticamente

Artículo escrito por mohit kumar 29 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *