-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathanagram_string.rb
86 lines (71 loc) · 1.47 KB
/
anagram_string.rb
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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# Check whether two strings are anagram of each other
def merge_sort(ar)
return ar if ar.length == 1
mid = ar.length / 2
left = ar[0, mid]
right = ar[mid, ar.length - 1]
first_half = merge_sort(left)
second_half = merge_sort(right)
merge(first_half, second_half)
end
def merge(ar1, ar2)
sorted_array = []
i = 0
j = 0
while i < ar1.length && j < ar2.length
if ar1[i] <= ar2[j]
sorted_array << ar1[i]
i += 1
else
sorted_array << ar2[j]
j += 1
end
end
while i < ar1.length
sorted_array << ar1[i]
i += 1
end
while j < ar2.length
sorted_array << ar2[j]
j += 1
end
sorted_array
end
# using 2 arrays
def is_anagram?(str1, str2)
ar1 = Array.new(256, 0)
ar2 = Array.new(256, 0)
str1.each_char do |char|
ar1[char.ord] += 1
end
str2.each_char do |char|
ar2[char.ord] += 1
end
(0..255).each do |e|
return false if ar1[e] != ar2[e]
end
true
end
# using single array
def is_anagram2?(str1, str2)
ar = Array.new(256, 0)
str1.each_char do |char|
ar[char.ord] += 1
end
str2.each_char do |char|
ar[char.ord] -= 1
end
puts ar.to_s
(0..255).each do |e|
return false if ar[e] != 0
end
true
end
def is_anagram1?(str1, str2)
return false if str1.length != str2.length
merge_sort(str1.split('')) == merge_sort(str2.split(''))
end
# puts is_anagram?('test', 'ttew')
# puts is_anagram?('abcd', 'dabc')
puts is_anagram2?('test', 'ttew')
puts is_anagram2?('abcd', 'dabc')