diff --git a/dsa/d3/exercise_4.py b/dsa/d3/exercise_4.py new file mode 100644 index 0000000..ab8780d --- /dev/null +++ b/dsa/d3/exercise_4.py @@ -0,0 +1,24 @@ +def main(): + s = "race a car" + print(palindrome(s)) + +def palindrome(s): + clean_s = "" + + for x in s: + if x.isalpha() or x.isdigit(): + clean_s+=x.lower() + if not clean_s: + return False + + left = 0 + right = len(clean_s)-1 + + while leftnums[i]: + current_sum=current_sum+nums[i] + else: + current_sum=nums[i] + temp_start=i + + if current_sum>max_sum: + max_sum=current_sum + best_start=temp_start + best_end=i + + return nums[best_start:best_end+1] + +if __name__ == "__main__": main() diff --git a/dsa/d5/exercise_6.py b/dsa/d5/exercise_6.py new file mode 100644 index 0000000..4a94a98 --- /dev/null +++ b/dsa/d5/exercise_6.py @@ -0,0 +1,18 @@ +from collections import defaultdict + + +def main(): + words = ["eat", "tea", "tan", "ate", "nat", "bat"] + print(group_anagram(words)) + +def group_anagram(words): + + result = defaultdict(list) + + for word in words: + key="".join(sorted(word)) + result[key].append(word) + return dict(result) + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/dsa/e1/exercise_5.py b/dsa/e1/exercise_5.py new file mode 100644 index 0000000..2ea6ea7 --- /dev/null +++ b/dsa/e1/exercise_5.py @@ -0,0 +1,14 @@ +def main(): + string = 'eceba' + k = 2 + print(longest_k_distinct(string,k)) + +def longest_k_distinct(string, k): + + left=0 + right=0 + count ={} + for right in range(len(string)): + count[string[right]] = count.get(string[right], 0) + 1 + while len(count) > k: + count[right]-=1 \ No newline at end of file diff --git a/dsa/e1/exercise_6.py b/dsa/e1/exercise_6.py new file mode 100644 index 0000000..78f43e5 --- /dev/null +++ b/dsa/e1/exercise_6.py @@ -0,0 +1,27 @@ +def main(): + string = 'eceba' + k = 2 + print(longest_k_distinct(string,k)) + +def longest_k_distinct(s, k): + left=0 + seen={} + max_length=0 + best_start=0 + for right in range(len(s)): + seen[s[right]] = seen.get(s[right],0)+1 + + while len(seen) > k: + seen[s[left]]-=1 + + if seen[s[left]]==0: + del seen[s[left]] + left+=1 + + if right - left + 1 > max_length: + max_length = right - left + 1 + best_start = left + + return s[best_start:best_start+max_length] + +if __name__ == "__main__": main() \ No newline at end of file diff --git a/dsa/e2/exercise_4.py b/dsa/e2/exercise_4.py new file mode 100644 index 0000000..4a2f700 --- /dev/null +++ b/dsa/e2/exercise_4.py @@ -0,0 +1,17 @@ +def main(): + a = [3,1,4,1,5] + b = [1,5,9,1] + print(ordered_intersection(a,b)) + +def ordered_intersection(a,b): + in_b = set(b) + added=set() + result=[] + + for x in a: + if x not in added and x in in_b: + added.add(x) + result.append(x) + return result + +if __name__ == "__main__": main() \ No newline at end of file diff --git a/dsa/e3/exercise_6.py b/dsa/e3/exercise_6.py new file mode 100644 index 0000000..7148812 --- /dev/null +++ b/dsa/e3/exercise_6.py @@ -0,0 +1,28 @@ +from collections import defaultdict + + +def main(): + logs = [ + "ivan,login,09:00", "ivan,upload,09:05", "ivan,login,09:10", + "maria,login,09:02", "maria,delete,09:06", "maria,upload,09:07", + "BAD", + "georgi,login,09:20", + ] + print(most_versatile_user(logs)) + +def most_versatile_user(logs): + versatile_users = defaultdict(set) + for log in logs: + try: + user, action, date = log.split(",") + except (AttributeError, ValueError): + continue + else: + versatile_users[user].add(action) + if not versatile_users: + return None + user = min(versatile_users, key=lambda u:(-len(versatile_users[u]), u)) + return user, len(versatile_users[user]) + +if __name__ == "__main__": + main() diff --git a/dsa/e3/exercise_7.py b/dsa/e3/exercise_7.py new file mode 100644 index 0000000..e0e10e6 --- /dev/null +++ b/dsa/e3/exercise_7.py @@ -0,0 +1,30 @@ +from collections import defaultdict + + +def main(): + logs = [ + "ivan,login,09:00", "ivan,upload,09:05", "ivan,login,09:10", + "maria,login,09:02", "maria,delete,09:06", "maria,upload,09:07", + "BAD", + "georgi,login,09:20", + ] + print(most_versatile_user(logs)) + +def most_versatile_user(logs): + + versatile_users=defaultdict(set) + for log in logs: + try: + user,action,time=log.split(",") + except (AttributeError, ValueError): + continue + else: + versatile_users[user].add(action) + + if not versatile_users: + return None + + user = max(versatile_users, key=lambda u:len(versatile_users[u])) + return user, len(versatile_users[user]) + +if __name__ == "__main__": main() diff --git a/dsa/e4/exercise_5.py b/dsa/e4/exercise_5.py new file mode 100644 index 0000000..7e0e64c --- /dev/null +++ b/dsa/e4/exercise_5.py @@ -0,0 +1,31 @@ +def main(): + a = [1,3,5] + b = [2,4,6] + print(merge_sorted(a,b)) + +def merge_sorted(a,b): + + result =[] + left=0 + right=0 + + while left target: + right = mid-1 + else: + left = mid+1 + return -1 + +if __name__ == "__main__": main() \ No newline at end of file diff --git a/searching_sorting/bubble_sort/exercise_6.py b/searching_sorting/bubble_sort/exercise_6.py new file mode 100644 index 0000000..ed6fc04 --- /dev/null +++ b/searching_sorting/bubble_sort/exercise_6.py @@ -0,0 +1,17 @@ +def main(): + nums = [5, 1, 4, 2, 8] + print(bubble_sort(nums)) + +def bubble_sort(nums): + + for i in range(len(nums)): + swapped = False + for j in range(len(nums)-1-i): + if nums[j] > nums[j+1]: + nums[j], nums[j+1] = nums[j+1], nums[j] + swapped=True + if not swapped: + break + return nums + +if __name__ == "__main__":main() \ No newline at end of file diff --git a/sliding_window/task3/exercise_8.py b/sliding_window/task3/exercise_8.py new file mode 100644 index 0000000..dac6718 --- /dev/null +++ b/sliding_window/task3/exercise_8.py @@ -0,0 +1,23 @@ +def main(): + s = "babad" + print(longest_non_repeating_substring(s)) + +def longest_non_repeating_substring(s): + left = 0 + seen = set() + max_length=0 + best_start=0 + for right in range(len(s)): + while s[right] in seen: + seen.remove(s[left]) + left+=1 + seen.add(s[right]) + if max_length