-
Notifications
You must be signed in to change notification settings - Fork 25
/
Max_min difference_anagrams.cpp
132 lines (109 loc) · 2.29 KB
/
Max_min difference_anagrams.cpp
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find the lexicographically
// smallest anagram of string
// which contains another string
pair<string, int> lexico_smallest(string s1,
string s2)
{
// Initializing the map and set
map<char, int> M;
set<char> S;
pair<string, int> pr;
// Iterating over s1
for (int i = 0; i <= s1.size() - 1; ++i) {
// Storing the frequency of
// characters present in s1
M[s1[i]]++;
// Storing the distinct
// characters present in s1
S.insert(s1[i]);
}
// Decreasing the frequency of
// characters from M that
// are already present in s2
for (int i = 0; i <= s2.size() - 1; ++i) {
M[s2[i]]--;
}
char c = s2[0];
int index = 0;
string res = "";
// Traversing alphabets
// in sorted order
for (auto x : S) {
// If current character of set
// is not equal to current
// character of s2
if (x != c) {
for (int i = 1; i <= M[x]; ++i) {
res += x;
}
}
else {
// If element is equal to
// current character of s2
int j = 0;
index = res.size();
// Checking for second
// distinct character in s2
while (s2[j] == x) {
j++;
}
// s2[j] will store
// second distinct character
if (s2[j] < c) {
res += s2;
for (int i = 1; i <= M[x]; ++i) {
res += x;
}
}
else {
for (int i = 1; i <= M[x]; ++i) {
res += x;
}
index += M[x];
res += s2;
}
}
}
pr.first = res;
pr.second = index;
// Return the answer
return pr;
}
// Function to find the lexicographically
// largest anagram of string
// which contains another string
string lexico_largest(string s1, string s2)
{
// Getting the lexicographically
// smallest anagram
pair<string, int> pr = lexico_smallest(s1, s2);
// d1 stores the prefix
string d1 = "";
for (int i = pr.second - 1; i >= 0; i--) {
d1 += pr.first[i];
}
// d2 stores the suffix
string d2 = "";
for (int i = pr.first.size() - 1;
i >= pr.second + s2.size(); --i) {
d2 += pr.first[i];
}
string res = d2 + s2 + d1;
// Return the result
return res;
}
// Driver Code
int main()
{
// Given two strings
string s1 = "ethgakagmenpgs";
string s2 = "geeks";
// Function Calls
cout << lexico_smallest(s1, s2).first
<< "\n" ;
cout << lexico_largest(s1, s2);
return (0);
}