Skip to content

Commit f0e2f0e

Browse files
authored
Merge pull request #2322 from Mohammed785/main
Create: 2002-maximum-product-of-the-length-of-two-palindromic-subsequences , 0179-largest-number, 0706-design-hashmap
2 parents 4e54968 + 1ca3bc9 commit f0e2f0e

17 files changed

+489
-0
lines changed

Diff for: csharp/0179-largest-number.cs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
public class Solution {
2+
public string LargestNumber(int[] nums)
3+
{
4+
if(nums.All(_ => _ == 0)) return "0";
5+
6+
var s = nums.Select(_ => _.ToString()).ToList();
7+
8+
s.Sort((a, b) => (b+a).CompareTo(a+b));
9+
10+
return string.Concat(s);
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
public class Solution {
2+
public int MaxProduct(string s) {
3+
if(s == null || s.Length < 2)
4+
return 0;
5+
if(s.Length == 2)
6+
return 1;
7+
8+
int n = s.Length;
9+
int total = 1 << n;
10+
11+
List<(int, int)> possible = new List<(int, int)>();
12+
13+
for(int i = 0; i < total; i++) {
14+
StringBuilder sb = new StringBuilder();
15+
16+
for(int j = 0; j < n; j++) {
17+
if((i & (1 << j)) != 0) {
18+
sb.Append(s[j]);
19+
}
20+
}
21+
22+
if(IsPalindrome(sb.ToString())) {
23+
possible.Add((i, sb.Length));
24+
}
25+
}
26+
27+
int ans = 0;
28+
for(int i = 0; i < possible.Count; i++) {
29+
int bitmask = possible[i].Item1;
30+
int count = possible[i].Item2;
31+
for(int j = i + 1; j < possible.Count; j++) {
32+
int bitmask2 = possible[j].Item1;
33+
int count2 = possible[j].Item2;
34+
if((bitmask & bitmask2) == 0)
35+
ans = Math.Max(ans, count * count2);
36+
}
37+
}
38+
return ans;
39+
}
40+
41+
private bool IsPalindrome(string s){
42+
int i = 0;
43+
int j = s.Length - 1;
44+
while(i < j) {
45+
if(s[i++] != s[j--])
46+
return false;
47+
}
48+
return true;
49+
}
50+
}

Diff for: go/0179-largest-number.go

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
func largestNumber(nums []int) string {
2+
ans, s := "", make([]string, len(nums))
3+
for i, num := range nums { s[i] = strconv.Itoa(num) }
4+
sort.Slice(s, func(a, b int) bool { return s[a] + s[b] > s[b] + s[a] })
5+
if s[0] == "0" { return "0" }
6+
for _, v := range s { ans += v }
7+
return ans
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
func maxProduct(s string) (res int) {
2+
dp := make([]int, 1<<len(s))
3+
mask := (1 << len(s)) - 1
4+
palindromeSize := func(s string, mask int) (res int) {
5+
i, j := 0, len(s)
6+
for i <= j {
7+
if mask&(1<<i) == 0 {
8+
i++
9+
} else if mask&(1<<j) == 0 {
10+
j--
11+
} else if s[i] != s[j] {
12+
return 0
13+
} else {
14+
if i == j {
15+
res++
16+
} else {
17+
res += 2
18+
}
19+
i++
20+
j--
21+
}
22+
}
23+
return res
24+
}
25+
26+
max := func(a, b int) int {
27+
if a > b {
28+
return a
29+
}
30+
return b
31+
}
32+
33+
for m := 1; m <= mask; m++ {
34+
dp[m] = palindromeSize(s, m)
35+
}
36+
37+
for m1 := mask; m1 > 0; m1-- {
38+
if dp[m1]*(len(s)-dp[m1]) <= res {
39+
continue
40+
}
41+
for m2 := mask ^ m1; m2 > 0; m2 = (m2 - 1) & (mask ^ m1) {
42+
res = max(res, dp[m1]*dp[m2])
43+
}
44+
}
45+
return
46+
}

Diff for: java/0706-design-hashmap.java

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
class ListNode {
2+
int key, val;
3+
ListNode next;
4+
public ListNode(int key, int val, ListNode next) {
5+
this.key = key;
6+
this.val = val;
7+
this.next = next;
8+
}
9+
}
10+
class MyHashMap {
11+
static final int size = 19997;
12+
static final int mult = 12582917;
13+
ListNode[] data;
14+
public MyHashMap() {
15+
this.data = new ListNode[size];
16+
}
17+
private int hash(int key) {
18+
return (int)((long)key * mult % size);
19+
}
20+
public void put(int key, int val) {
21+
remove(key);
22+
int h = hash(key);
23+
ListNode node = new ListNode(key, val, data[h]);
24+
data[h] = node;
25+
}
26+
public int get(int key) {
27+
int h = hash(key);
28+
ListNode node = data[h];
29+
for (; node != null; node = node.next)
30+
if (node.key == key) return node.val;
31+
return -1;
32+
}
33+
public void remove(int key) {
34+
int h = hash(key);
35+
ListNode node = data[h];
36+
if (node == null) return;
37+
if (node.key == key) data[h] = node.next;
38+
else for (; node.next != null; node = node.next)
39+
if (node.next.key == key) {
40+
node.next = node.next.next;
41+
return;
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
class Solution {
2+
public int maxProduct(String s) {
3+
int[] dp = new int[4096];
4+
int res = 0, mask = (1 << s.length()) - 1;
5+
for (int m = 1; m <= mask; ++m)
6+
dp[m] = palSize(s, m);
7+
for (int m1 = mask; m1 > 0; --m1)
8+
if (dp[m1] * (s.length() - dp[m1]) > res)
9+
for(int m2 = mask ^ m1; m2 > 0; m2 = (m2 - 1) & (mask ^ m1))
10+
res = Math.max(res, dp[m1] * dp[m2]);
11+
return res;
12+
}
13+
private int palSize(String s, int mask) {
14+
int p1 = 0, p2 = s.length(), res = 0;
15+
while (p1 <= p2) {
16+
if ((mask & (1 << p1)) == 0)
17+
++p1;
18+
else if ((mask & (1 << p2)) == 0)
19+
--p2;
20+
else if (s.charAt(p1) != s.charAt(p2))
21+
return 0;
22+
else
23+
res += 1 + (p1++ != p2-- ? 1 : 0);
24+
}
25+
return res;
26+
}
27+
}

Diff for: javascript/0179-largest.number.js

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/**
2+
* @param {number[]} nums
3+
* @return {string}
4+
*/
5+
var largestNumber = function (nums) {
6+
let largest = nums
7+
.map((n) => n.toString())
8+
.sort((x, y) => y + x - (x + y))
9+
.join('');
10+
return largest[0] === '0' ? '0' : largest;
11+
};

Diff for: javascript/0706-design-hashmap.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
var MyHashMap = function () {
2+
this.map = new Map();
3+
};
4+
5+
/**
6+
* @param {number} key
7+
* @param {number} value
8+
* @return {void}
9+
*/
10+
MyHashMap.prototype.put = function (key, value) {
11+
this.map.set(key, value);
12+
};
13+
14+
/**
15+
* @param {number} key
16+
* @return {number}
17+
*/
18+
MyHashMap.prototype.get = function (key) {
19+
const val = this.map.get(key);
20+
return val !== undefined ? val : -1;
21+
};
22+
23+
/**
24+
* @param {number} key
25+
* @return {void}
26+
*/
27+
MyHashMap.prototype.remove = function (key) {
28+
this.map.delete(key);
29+
};
30+
31+
/**
32+
* Your MyHashMap object will be instantiated and called as such:
33+
* var obj = new MyHashMap()
34+
* obj.put(key,value)
35+
* var param_2 = obj.get(key)
36+
* obj.remove(key)
37+
*/
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
* Time Complexity: O(2^N)
5+
* Space Complexity: O(2^N)
6+
*/
7+
var maxProduct = function (s) {
8+
const N = s.length;
9+
const first = new Array(1 << N).fill(0),
10+
last = new Array(1 << N).fill(0);
11+
for (let i = 0; i < N; i++) {
12+
for (let j = 1 << i; j < 1 << (i + 1); j++) {
13+
first[j] = i;
14+
}
15+
}
16+
for (let i = 0; i < N; i++) {
17+
for (let j = 1 << i; j < 1 << N; j += 1 << (i + 1)) {
18+
last[j] = i;
19+
}
20+
}
21+
const dp = Memo((m) => {
22+
if ((m & (m - 1)) === 0) {
23+
return m != 0;
24+
}
25+
const l = last[m],
26+
f = first[m];
27+
const lb = 1 << l,
28+
fb = 1 << f;
29+
return Math.max(
30+
dp(m - lb),
31+
dp(m - fb),
32+
dp(m - lb - fb) + (s[l] == s[f]) * 2
33+
);
34+
});
35+
let ans = 0;
36+
for (let m = 1; m < 1 << N; m++) {
37+
ans = Math.max(ans, dp(m) * dp((1 << N) - 1 - m));
38+
}
39+
return ans;
40+
};
41+
42+
var Memo = (func) => {
43+
const map = new Map();
44+
var wrapper = (m) => {
45+
if (!map.get(m)) {
46+
map.set(m, func(m));
47+
}
48+
return map.get(m);
49+
};
50+
return wrapper;
51+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
"""
2+
Time Complexity: O(2^N)
3+
Space Complexity: O(2^N)
4+
"""
5+
class Solution:
6+
def maxProduct(self, s):
7+
n = len(s)
8+
9+
first, last = [0]*(1<<n), [0]*(1<<n)
10+
11+
for i in range(n):
12+
for j in range(1<<i, 1<<(i+1)):
13+
first[j] = i
14+
15+
for i in range(n):
16+
for j in range(1<<i, 1<<n, 1<<(i+1)):
17+
last[j] = i
18+
19+
@lru_cache(None)
20+
def dp(m):
21+
if m & (m-1) == 0: return m != 0
22+
l, f = last[m], first[m]
23+
lb, fb = 1<<l, 1<<f
24+
return max(dp(m-lb), dp(m-fb), dp(m-lb-fb) + (s[l] == s[f]) * 2)
25+
26+
ans = 0
27+
for m in range(1, 1<<n):
28+
ans = max(ans, dp(m)*dp((1<<n) - 1 - m))
29+
30+
return ans

Diff for: ruby/0179-largest-number.rb

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
# @param {Integer[]} nums
2+
# @return {String}
3+
def largest_number(nums)
4+
nums.sort! {|a, b| b.to_s + a.to_s <=> a.to_s + b.to_s}.join.to_i.to_s
5+
end

Diff for: rust/0179-largest-number.rs

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
impl Solution {
2+
pub fn largest_number(nums: Vec<i32>) -> String {
3+
let mut v: Vec<String> = nums.iter().map(|&num| num.to_string()).collect();
4+
v.sort_by(|a: &String, b: &String| (b.clone() + a).cmp(&(a.clone() + b)));
5+
if v[0] == "0" {
6+
String::from("0")
7+
} else {
8+
v.join("")
9+
}
10+
}
11+
}

Diff for: rust/0706-design-hashmap.rs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
struct MyHashMap {
2+
buckets: Vec<Vec<(i32,i32)>>,
3+
}
4+
5+
// Prime number of buckets to reduce collisions
6+
const N_BUCKETS: usize = 1031;
7+
8+
impl MyHashMap {
9+
10+
fn new() -> Self {
11+
Self{ buckets: vec![vec![]; N_BUCKETS] }
12+
}
13+
14+
fn hash(key: i32) -> usize {
15+
key as usize % N_BUCKETS
16+
}
17+
18+
fn find_entry(&mut self, key: i32) -> (&mut Vec<(i32, i32)>, Result<usize, usize>) {
19+
let bucket = &mut self.buckets[Self::hash(key)];
20+
let result = bucket.binary_search_by(|(k, v)| k.cmp(&key));
21+
(bucket, result)
22+
}
23+
24+
fn put(&mut self, key: i32, value: i32) {
25+
match self.find_entry(key) {
26+
(bucket, Ok(index)) => bucket[index] = (key, value),
27+
(bucket, Err(index)) => bucket.insert(index, (key, value)),
28+
}
29+
}
30+
31+
fn get(&self, key: i32) -> i32 {
32+
let bucket = &self.buckets[Self::hash(key)];
33+
match bucket.binary_search_by(|(k, v)| k.cmp(&key)) {
34+
Ok(index) => bucket[index].1,
35+
Err(index) => -1,
36+
}
37+
}
38+
39+
fn remove(&mut self, key: i32) {
40+
match self.find_entry(key) {
41+
(bucket, Ok(index)) => { bucket.remove(index); },
42+
_ => (),
43+
}
44+
}
45+
}

0 commit comments

Comments
 (0)