Skip to content
Merged
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: 38 additions & 41 deletions backtracking/subarray_sum.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,62 +10,59 @@
* array saja.
*/

#include <iostream>
#include <cassert>
#include <cstdint>
#include <iostream>
#include <unordered_map>
#include <vector>

/**
* @brief algoritma backtracking
* @namespace backtracking
*
*
*/
namespace backtracking {
namespace subarray_sum{
/**
* @brief fungsi utama untuk implementasi dari subarray sum
* @param sum adalah yang diperlukan dari setiap subarray
* @param in_arr adalh input dari array
* @return jumlah dari angka set
*/
uint64_t subarray_sum(int64_t sum, const std::vector<int64_t> &in_arr){
int64_t nelement = in_arr.size();
int64_t count_of_subset = 0;
int64_t current_sum = 0;
std::unordered_map<int64_t, int64_t>
sumarray;

for (int64_t i = 0; i < nelement; i++){
current_sum += in_arr[i];
if (current_sum == sum){
count_of_subset++;
}
namespace subarray_sum {
/**
* @brief fungsi utama untuk implementasi dari subarray sum
* @param sum adalah yang diperlukan dari setiap subarray
* @param in_arr adalh input dari array
* @return jumlah dari angka set
*/
uint64_t subarray_sum(int64_t sum, const std::vector<int64_t> &in_arr) {
int64_t nelement = in_arr.size();
int64_t count_of_subset = 0;
int64_t current_sum = 0;
std::unordered_map<int64_t, int64_t> sumarray;

// jika seandainya current_sum lebih besar
// dari jumlah yang dibutuhkan
if (sumarray.find(current_sum - sum) != sumarray.end()){
count_of_subset += (sumarray[current_sum - sum]);
}
sumarray[current_sum]++;
}
return count_of_subset;
}
for (int64_t i = 0; i < nelement; i++) {
current_sum += in_arr[i];
if (current_sum == sum) {
count_of_subset++;
}

// jika seandainya current_sum lebih besar
// dari jumlah yang dibutuhkan
if (sumarray.find(current_sum - sum) != sumarray.end()) {
count_of_subset += (sumarray[current_sum - sum]);
}
sumarray[current_sum]++;
}
return count_of_subset;
}
} // namespace subarray_sum
} // namespace backtracking

static void testing(){
std::cout<<"test pertama ";
std::vector<int64_t> array1 = {-7, -3, -2, 5, 8};
assert(
backtracking::subarray_sum::subarray_sum(0, array1) == 1
);
static void testing() {
std::cout << "test pertama ";
std::vector<int64_t> array1 = {-7, -3, -2, 5, 8};
assert(backtracking::subarray_sum::subarray_sum(0, array1) == 1);

std::cout<<"berhasil!"<<std::endl;
std::cout << "berhasil!" << std::endl;
}

int main() {
testing();

int main(){
testing();

return 0;
return 0;
}
147 changes: 68 additions & 79 deletions backtracking/wildcard_matching.cpp
Original file line number Diff line number Diff line change
@@ -1,99 +1,88 @@
#include <cassert>
#include <iostream>
#include <vector>
#include <cassert>
#include <cstdint>
#include <iostream>
#include <vector>

namespace backtracking {
namespace wildcard_matching {
std::vector<std::vector<int64_t>> dpTable(1000, std::vector<int64_t>(1000, -1));
bool wildcard_matching(std::string s, std::string p, uint32_t pos1,
uint32_t pos2) {
uint32_t n = s.length();
uint32_t m = p.length();
if (pos1 == n && pos2 == m) {
return true;
std::uint32_t pos2) {
uint32_t n = s.length();
uint32_t m = p.length();
if (pos1 == n && pos2 == m) {
return true;
}
if (pos1 != n && pos2 == m) {
return false;
}
if (pos1 == n && pos2 != m) {
while (pos2 < m && p[pos2] == '*') {
pos2++;
}
if (pos1 != n && pos2 == m) {
return false;
}
if (pos1 == n && pos2 != m) {
while (pos2 < m && p[pos2] == '*') {
pos2++;
}

return pos2 == m;
}
if (dpTable[pos1][pos2] != -1) {
return dpTable[pos1][pos2];
}
if (s[pos1] == p[pos2]) {
return dpTable[pos1][pos2] =
wildcard_matching(s, p, pos1 + 1, pos2 + 1);
}
return pos2 == m;
}
if (dpTable[pos1][pos2] != -1) {
return dpTable[pos1][pos2];
}
if (s[pos1] == p[pos2]) {
return dpTable[pos1][pos2] = wildcard_matching(s, p, pos1 + 1, pos2 + 1);
}

else {
if (p[pos2] == '?') {
return dpTable[pos1][pos2] =
wildcard_matching(s, p, pos1 + 1, pos2 + 1);
}
else if (p[pos2] == '*') {
return dpTable[pos1][pos2] =
wildcard_matching(s, p, pos1, pos2 + 1) ||
wildcard_matching(s, p, pos1 + 1, pos2);
}
else {
return dpTable[pos1][pos2] = 0;
}
else {
if (p[pos2] == '?') {
return dpTable[pos1][pos2] = wildcard_matching(s, p, pos1 + 1, pos2 + 1);
} else if (p[pos2] == '*') {
return dpTable[pos1][pos2] = wildcard_matching(s, p, pos1, pos2 + 1) ||
wildcard_matching(s, p, pos1 + 1, pos2);
} else {
return dpTable[pos1][pos2] = 0;
}
}
}

} // namespace wildcard_matching
} // namespace backtracking

} // namespace wildcard_matching
} // namespace backtracking

static void test() {
std::cout << "1st test ";
std::string matching1 = "baaabab";
std::string pattern1 = "*****ba*****ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching1,
pattern1, 0, 0) ==
1);
std::cout << "passed" << std::endl;

std::cout << "1st test ";
std::string matching1 = "baaabab";
std::string pattern1 = "*****ba*****ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching1, pattern1,
0, 0) == 1);
std::cout << "passed" << std::endl;

std::cout << "2nd test ";
std::string matching2 = "baaabab";
std::string pattern2 = "ba*****ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching2,
pattern2, 0, 0) ==
1);
std::cout << "passed" << std::endl;
std::cout << "2nd test ";
std::string matching2 = "baaabab";
std::string pattern2 = "ba*****ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching2, pattern2,
0, 0) == 1);
std::cout << "passed" << std::endl;

std::cout << "3rd test ";
std::string matching3 = "baaabab";
std::string pattern3 = "ba*ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching3,
pattern3, 0, 0) ==
1);
std::cout << "passed" << std::endl;
std::cout << "3rd test ";
std::string matching3 = "baaabab";
std::string pattern3 = "ba*ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching3, pattern3,
0, 0) == 1);
std::cout << "passed" << std::endl;

std::cout << "4th test ";
std::string matching4 = "baaabab";
std::string pattern4 = "a*ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching4,
pattern4, 0, 0) ==
1);
std::cout << "passed" << std::endl;
std::cout << "4th test ";
std::string matching4 = "baaabab";
std::string pattern4 = "a*ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching4, pattern4,
0, 0) == 1);
std::cout << "passed" << std::endl;

std::cout << "5th test ";
std::string matching5 = "baaabab";
std::string pattern5 = "aa?ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching5,
pattern5, 0, 0) ==
1);
std::cout << "passed" << std::endl;
std::cout << "5th test ";
std::string matching5 = "baaabab";
std::string pattern5 = "aa?ab";
assert(backtracking::wildcard_matching::wildcard_matching(matching5, pattern5,
0, 0) == 1);
std::cout << "passed" << std::endl;
}

int main() {
test();
return 0;
}
test();
return 0;
}
Loading