Weighted Uniform Strings

Sort by

recency

|

800 Discussions

|

  • + 0 comments
        public static List<String> weightedUniformStrings(String s, List<Integer> queries) {
        // Write your code here
        List<String> ans = new ArrayList<>();
        HashSet<Integer> weights = new HashSet<>();
        
        int currentweight = 0;
        char prevChar = ' ';
        
        for(int i = 0; i < s.length(); i++) {
            char currentChar = s.charAt(i);
            int charWeight = currentChar - 'a' + 1;
            
            if(currentChar == prevChar) {
                currentweight += charWeight;
            } else {
                currentweight = charWeight;
            }
            weights.add(currentweight);
            prevChar = currentChar;
        }
        
        for(int i : queries) {
                if(weights.contains(i)) {
                    ans.add("Yes");
                } else {
                ans.add("No");
                }
        }
            return ans;
        }
    
  • + 0 comments

    Here is a solution in python with O(n + m) time and O(m) space.

    The space is in part because althogh the set cat grow as large as 26, values can be access at O(1) and the queries are the values that we search for in the set at a time of O(m) and equel space.

    def weightedUniformStrings(s, queries):
        res = []
        q_set = set([])
        weight = 0
        
        for i in range(len(s)): # O(n)
            if i == 0 or s[i] != s[i - 1]:
                weight = ord(s[i]) - ord('a') + 1
            else:
                weight += ord(s[i]) - ord('a') + 1
            
            q_set.add(weight) # O(n)
    
        for val in queries: # O(m)
            if val in q_set:
                res.append("Yes")
            else:
                res.append("No")
                
        return res
    
  • + 0 comments
    def weightedUniformStrings(s, queries):
        # Write your code here
        
        n = set()
        c = 0
        repeat_multiplier = 1
        while c < len(s):
            if c > 0 and s[c - 1] == s[c]:
                repeat_multiplier += 1
            else:
                repeat_multiplier = 1
            weight = (ord(s[c]) - 96) * repeat_multiplier
            n.add(weight)
            c += 1
        result = []
        for i in queries:
            if i in n:
                result.append("Yes")
            else:
                result.append("No")
        return result
    
  • + 0 comments

    Here is problem solution in python java c++ c and javascript - https://programmingoneonone.com/hackerrank-weighted-uniform-strings-problem-solution.html

  • + 0 comments

    Python Tip rather than a solution: - A data type 'set' is faster to find a value than a data type 'list'. - It is because 'set' follows hash-based search O(1) and 'list' follows the linear search O(n).