Question:

Solution:

class Solution {
    public int maxScoreWords(String[] words, char[] letters, int[] score) {
        int[] freqOfLetters = new int[score.length];
        for (char ch : letters) {
            freqOfLetters[ch - 'a']++;
        }
        int res = backtrack(words, score, freqOfLetters, 0);
        return res;
    }
 
    private int backtrack(String[] words, int[] score, int[] farr, int idx) {
        if (idx == words.length) {
            return 0;
        }
 
        int scoreNo = 0 + backtrack(words, score, farr, idx + 1); // No call
 
        boolean isValid = true;
        int scoreOfWord = 0;
        for (char ch : words[idx].toCharArray()) {
            if (farr[ch - 'a'] == 0) {
                isValid = false;
                //break; (break won't be a good Idea because while recursing back we are incrementing the
                // freq of each char in that word but you broke out of the loop toh wahan freq jayada 
                // ho jayegi, ya toh remember kahan pe break huye wahi tak ki freq badhao, instead let the
                // loop happen and correct it recursively.)
            }
            farr[ch - 'a']--;
            scoreOfWord += score[ch - 'a'];
        }
 
        int scoreYes = 0;
        if (isValid) {
            scoreYes = scoreOfWord + backtrack(words, score, farr, idx + 1); // Yes call
        }
 
        //Correct the freq array after backtracking
        for (char ch : words[idx].toCharArray()) {
            farr[ch - 'a']++;
        }
 
        return Math.max(scoreYes, scoreNo);
    }
}