Skip to content

Commit 1eb94b9

Browse files
authored
Merge pull request #1853 from yhkee0404/main
[yhkee0404] WEEK 05 solutions
2 parents 3de3b7a + f72c94c commit 1eb94b9

File tree

5 files changed

+139
-0
lines changed

5 files changed

+139
-0
lines changed
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
func maxProfit(prices []int) int {
2+
ans := 0
3+
bought := prices[0]
4+
for i := 1; i != len(prices); i++ {
5+
ans = max(ans, prices[i] - bought)
6+
bought = min(bought, prices[i])
7+
}
8+
return ans
9+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
public class Solution {
2+
/*
3+
* @param strs: a list of strings
4+
* @return: encodes a list of strings to a single string.
5+
*/
6+
public String encode(List<String> strs) {
7+
// write your code here
8+
return strs.parallelStream()
9+
.map(s ->
10+
s.chars()
11+
.parallel()
12+
.mapToObj(c -> new StringBuilder(String.format("%02x", c)))
13+
.collect(
14+
StringBuilder::new,
15+
StringBuilder::append,
16+
(a, b) -> a.append(b)
17+
)
18+
).collect(
19+
StringBuilder::new,
20+
(a, b) -> a.append(b)
21+
.append(' '),
22+
(a, b) -> a.append(b)
23+
).toString();
24+
}
25+
26+
/*
27+
* @param str: A string
28+
* @return: decodes a single string to a list of strings
29+
*/
30+
public List<String> decode(String str) {
31+
// write your code here
32+
final List<String> ans = new ArrayList<>();
33+
final StringTokenizer st = new StringTokenizer(str);
34+
while (st.hasMoreTokens()) {
35+
final String s = st.nextToken();
36+
final StringBuilder sb = new StringBuilder();
37+
for (int i = 0; i < s.length(); i += 2) {
38+
sb.append((char) Integer.parseInt(s.substring(i, i + 2), 16));
39+
}
40+
ans.add(sb.toString());
41+
}
42+
return ans;
43+
}
44+
}

group-anagrams/yhkee0404.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
use itertools::Itertools;
2+
3+
impl Solution {
4+
pub fn group_anagrams(strs: Vec<String>) -> Vec<Vec<String>> {
5+
let sorted_strings: Vec<String> = strs
6+
.iter()
7+
.map(|s| {
8+
s.chars()
9+
.sorted()
10+
.collect()
11+
}).collect();
12+
let inverted_sorted_strings: Vec<usize> = (0..sorted_strings.len())
13+
.sorted_by_key(|&i| &sorted_strings[i])
14+
.collect();
15+
let mut ans: Vec<Vec<String>> = vec![];
16+
let mut i = 0;
17+
let mut j;
18+
while i != sorted_strings.len() {
19+
let mut u: Vec<String> = vec![];
20+
j = i;
21+
while j == i || j != inverted_sorted_strings.len() && sorted_strings[inverted_sorted_strings[i]] == sorted_strings[inverted_sorted_strings[j]] {
22+
u.push(strs[inverted_sorted_strings[j]].clone());
23+
j += 1;
24+
}
25+
ans.push(u);
26+
i = j
27+
}
28+
ans
29+
}
30+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
class Trie {
2+
3+
final int n;
4+
final children = <int, Trie>{};
5+
bool ended = false;
6+
7+
Trie([this.n = 0]);
8+
9+
void insert(String word) {
10+
Trie u = this;
11+
for (int rune in word.runes) {
12+
u = u.children
13+
.putIfAbsent(rune, () => Trie(rune));
14+
}
15+
u.ended = true;
16+
}
17+
18+
bool search(String word) => _search(word)?.ended ?? false;
19+
20+
bool startsWith(String prefix) => _search(prefix) != null;
21+
22+
Trie? _search(String word) {
23+
Trie? u = this;
24+
for (int rune in word.runes) {
25+
u = u!.children[rune];
26+
if (u == null) {
27+
return null;
28+
}
29+
}
30+
return u;
31+
}
32+
}
33+
34+
/**
35+
* Your Trie object will be instantiated and called as such:
36+
* Trie obj = Trie();
37+
* obj.insert(word);
38+
* bool param2 = obj.search(word);
39+
* bool param3 = obj.startsWith(prefix);
40+
*/

word-break/yhkee0404.scala

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
object Solution {
2+
def wordBreak(s: String, wordDict: List[String]): Boolean = {
3+
val dp = Array.fill(s.length + 1)(false) // S(s, wordDict, word) = O(s.length)
4+
dp(0) = true
5+
(0 to s.length - 1).exists { i =>
6+
if (! dp(i)) false
7+
else wordDict.exists { word =>
8+
val j = i + word.length
9+
if (j <= s.length && ! dp(j) && s.substring(i, j) == word) {
10+
dp(j) = true // T(s, wordDict, word) = O(s.length * wordDict.length * word.length)
11+
}
12+
dp(s.length)
13+
}
14+
}
15+
}
16+
}

0 commit comments

Comments
 (0)