diff --git a/Coin-Change-II.cpp b/Coin-Change-II.cpp new file mode 100644 index 0000000..1d64f15 --- /dev/null +++ b/Coin-Change-II.cpp @@ -0,0 +1,79 @@ +/***************************************************************************************************** + * + * You are given coins of different denominations and a total amount of money. Write a function to + * compute the number of combinations that make up that amount. You may assume that you have infinite + * number of each kind of coin. + * + * Example 1: + * + * Input: amount = 5, coins = [1, 2, 5] + * Output: 4 + * Explanation: there are four ways to make up the amount: + * 5=5 + * 5=2+2+1 + * 5=2+1+1+1 + * 5=1+1+1+1+1 + * + * Example 2: + * + * Input: amount = 3, coins = [2] + * Output: 0 + * Explanation: the amount of 3 cannot be made up just with coins of 2. + * + * Example 3: + * + * Input: amount = 10, coins = [10] + * Output: 1 + * + * Note: + * + * You can assume that + * + * 0 <= amount <= 5000 + * 1 <= coin <= 5000 + * the number of coins is less than 500 + * the answer is guaranteed to fit into signed 32-bit integer + * + ******************************************************************************************************/ +class Solution { +public: + int change(int amount, vector& coins) { + return change_dp(amount, coins); + return change_recursive(amount, coins); // Time Limit Error + } + + + int change_recursive(int amount, vector& coins) { + int result = 0; + change_recursive_helper(amount, coins, 0, result); + return result; + } + + // the `idx` is used for remove the duplicated solutions. + void change_recursive_helper(int amount, vector& coins, int idx, int& result) { + if (amount == 0) { + result++; + return; + } + + for ( int i = idx; i < coins.size(); i++ ) { + if (amount < coins[i]) continue; + change_recursive_helper(amount - coins[i], coins, i, result); + } + return; + } + + int change_dp(int amount, vector& coins) { + vector dp(amount+1, 0); + dp[0] = 1; + for (int i=0; i= coins[i]) { + dp[n] += dp[n-coins[i]]; + } + } + } + + return dp[amount]; + } +}; diff --git a/Find-All-Anagrams-in-a-String.cpp b/Find-All-Anagrams-in-a-String.cpp new file mode 100644 index 0000000..4810721 --- /dev/null +++ b/Find-All-Anagrams-in-a-String.cpp @@ -0,0 +1,47 @@ +/***************************************************************************************************** +* Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. +* Strings consists of lowercase English letters only and the length of both strings s and p will not be larger than 20,100. +* The order of output does not matter. +* Example 1: +* Input: + s: "cbaebabacd" p: "abc" +* Output: + [0, 6] +* Explanation: + The substring with start index = 0 is "cba", which is an anagram of "abc". + The substring with start index = 6 is "bac", which is an anagram of "abc". +*Example 2: +* Input: + s: "abab" p: "ab" +* Output: + [0, 1, 2] +* Explanation: +* The substring with start index = 0 is "ab", which is an anagram of "ab". +* The substring with start index = 1 is "ba", which is an anagram of "ab". +* The substring with start index = 2 is "ab", which is an anagram of "ab". + ******************************************************************************************************/ + + +class Solution { + public: + vector findAnagrams(string s, string p) { + vectorresult; + vectorv1(26); + if(s.size()v2(26); + for(int index=i;index<(i+p.size());index++){ + v2[s[index]-97]++; + } + if(v1==v2){ + result.push_back(i); + } + } + return result; + } +}; \ No newline at end of file