xxxxxxxxxx
void permute(string a, int l, int r)
{
// Base case
if (l == r)
cout<<a<<endl;
else
{
// Permutations made
for (int i = l; i <= r; i++)
{
// Swapping done
swap(a[l], a[i]);
// Recursion called
permute(a, l+1, r);
//backtrack
swap(a[l], a[i]);
}
}
}
xxxxxxxxxx
# get all permutations of string
import itertools
for p in itertools.permutations('123'):
print(p) # ( ' 1 ', ' 2 ', ' 3 ') ( ' 1 ' , ' 3 ', ' 2 ' ) ( ' 2 ', ' 1 ', ' 3 ' )
xxxxxxxxxx
void find_permutations(vector<int> &array, size_t index, vector<int> current_perm, vector<vector<int>> &res){
if(index == array.size())
res.push_back(current_perm);
else{
for(size_t i = 0; i <= current_perm.size(); ++i){
vector<int> new_perm(current_perm.begin(), current_perm.end());
new_perm.insert(new_perm.begin()+i, array[index]);
find_permutations(array, index+1, new_perm, res);
}
}
}
xxxxxxxxxx
def permute(s):
if len(s) == 0:
return []
elif len(s) == 1:
return [s]
else:
permutations = []
for i in range(len(s)):
char = s[i]
remaining_chars = s[:i] + s[i+1:]
for p in permute(remaining_chars):
permutations.append(char + p)
return permutations
string = "abc" # Replace with the desired input string
print(permute(string))
xxxxxxxxxx
void permutation(string s)
{
sort(s.begin(),s.end());
do{
cout << s << " ";
}
while(next_permutation(s.begin(),s.end()); // std::next_permutation
cout << endl;
}
xxxxxxxxxx
import collections
class Solution:
def checkInclusion(self, s1, s2):
"""
:type s1: str
:type s2: str
:rtype: bool
"""
'''
Apprach 3:
Just changing the collections.Counter to collections.defaultdict
improved the speed
94.36%, Nice. :)
'''
ctr1 = collections.defaultdict(int)
ctr2 = collections.defaultdict(int)
for x in s1: ctr1[x] += 1
for x in s2[:len(s1)]: ctr2[x] += 1
i = 0; j = len(s1)
while j < len(s2):
if ctr2 == ctr1: return True
ctr2[s2[i]] -= 1
if ctr2[s2[i]] < 1: ctr2.pop(s2[i]);
ctr2[s2[j]] = ctr2.get(s2[j], 0) + 1
i += 1; j += 1
return ctr2 == ctr1
'''
Approach 2:
Use the same counter but much more effeciently
63% beated, okay not bad..
two pointers i(front) j(last), delete and add accordingly and check for the counts
# Code Below
'''
ctr1 = collections.Counter(s1)
ctr2 = collections.Counter(s2[:len(s1)])
i = 0; j = len(s1)
while j < len(s2):
if ctr2 == ctr1: return True
ctr2[s2[i]] -= 1
if ctr2[s2[i]] < 1: ctr2.pop(s2[i]);
ctr2[s2[j]] = ctr2.get(s2[j], 0) + 1
i += 1; j += 1
return ctr2 == ctr1
'''
1. Approach 1
Things i Missed:
- Had the len(s2) - len(s1) + 1: forgot to add the 1 in the if condition
Ultra easy solution
Slice and check for the equality
5% beat, yuck !!
# Code below
'''
ctr1 = collections.Counter(s1)
i = 0
while i < len(s2) - len(s1) + 1:
if s2[i] in ctr1:
ctr2 = collections.Counter(s2[i: i+len(s1)])
if ctr1 == ctr2: return True
i += 1
return False