Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 79 additions & 0 deletions Coin-Change-II.cpp
Original file line number Diff line number Diff line change
@@ -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<int>& coins) {
return change_dp(amount, coins);
return change_recursive(amount, coins); // Time Limit Error
}


int change_recursive(int amount, vector<int>& 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<int>& 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<int>& coins) {
vector<int> dp(amount+1, 0);
dp[0] = 1;
for (int i=0; i<coins.size(); i++) {
for(int n=1; n<=amount; n++) {
if (n >= coins[i]) {
dp[n] += dp[n-coins[i]];
}
}
}

return dp[amount];
}
};
47 changes: 47 additions & 0 deletions Find-All-Anagrams-in-a-String.cpp
Original file line number Diff line number Diff line change
@@ -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<int> findAnagrams(string s, string p) {
vector<int>result;
vector<int>v1(26);
if(s.size()<p.size()){
return result;
}
for(int i=0;i<p.size();i++){
v1[p[i]-97]++;
}
for(int i=0;i<=(s.size()-p.size());i++){
vector<int>v2(26);
for(int index=i;index<(i+p.size());index++){
v2[s[index]-97]++;
}
if(v1==v2){
result.push_back(i);
}
}
return result;
}
};