1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61

mod dp_module;

#[cfg(feature="python")]
mod py_module;

pub use self::dp_module::*;

#[cfg(feature="wasm")]
use wasm_bindgen::prelude::*;

#[cfg(feature="wasm")]
#[wasm_bindgen]
pub fn wasm_find_subset(keys: String, targets: String, max_key_length: usize, max_target_length: usize, n_candidates: usize) -> String {
    let mut keys: Vec<i32> = keys.split(",").map(|x| x.trim().parse::<i32>().unwrap()).collect();
    if targets.contains(", ") {

        let mut targets: Vec<i32> = targets.split(",").map(|x| x.trim().parse::<i32>().unwrap()).collect();
        if keys.iter().sum::<i32>() != targets.iter().sum::<i32>() {
            let ks = keys.iter().sum::<i32>();
            let ts = targets.iter().sum::<i32>();
            return format!("The sums of two arrays must be the same values. key's sum is {}. target's sum is {}.", ks, ts);
        }
        let result: Vec<Vec<(Vec<i32>, Vec<i32>)>> = dp::sequence_matcher(&mut keys, &mut targets, max_key_length, max_target_length, n_candidates);
        let mut s: Vec<String> = vec![];
        if result.len() == 0 {
            return "No solution. You might want to increase maximum length.".to_string();
        }
        for r in result{
            let mut t: Vec<String> = vec![];
            for elem in r{
                let mut key_str = String::new();
                let mut target_str = String::new();
                for key in elem.0{
                    key_str.push_str(&key.to_string());
                    key_str.push_str(", ");
                }
                for target in elem.1{
                    target_str.push_str(&target.to_string());
                    target_str.push_str(", ");
                }
                t.push(format!("([{}] [{}])", key_str, target_str));
            }
            s.push(format!("[{}]\n", t.join(",  ")))
        }
        format!("[{}]\n", s.join(", "))
    } else {
        let res: Vec<Vec<i32>> = dp::find_subset(keys, targets.parse::<i32>().unwrap(), max_target_length);
        let mut r3: Vec<String> = vec![];
        if res.len() == 0 {
            return "No solution. You might want to increase maximum subset length.".to_string();
        }
        for r in res{
            let mut r2: String = r.into_iter().map(|x| format!("{}, ", x.to_string())).collect::<String>();
            r2 = format!("[{}]", r2).replace(", ]", "]");
            r3.push(r2);
        }
        let s: String = r3.join(", ");
        s
    }
}