A substring is contigous sequence of charachters .count number of substrings of a string
Answers
Answered by
1
Method 1 (Simple): In this approach we use brute force and find all the sub-strings and pass them through our function checkEquality to see if starting and ending characters are same.
C++
// C++ program to count all substrings with same
// first and last characters.
#include <bits/stdc++.h>
using namespace std;
// Returns true if first and last characters
// of s are same.
int checkEquality(string s)
{
return (s[0] == s[s.size() - 1]);
}
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Starting point of substring
for (int i = 0; i < n; i++)
// Length of substring
for (int len = 1; len <= n-i; len++)
// Check if current substring has same
// starting and ending characters.
if (checkEquality(s.substr(i, len)))
result++;
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
Output:7
Although the above code works fine, it’s not efficient as its time complexity is O(n2). Note that there are n*(n+1)/2 substrings of a string of length n. This solution also requires O(n) extra space as we one by one create all substrings.
Method 2 (Space Efficient): In this approach we don’t actually generate substrings rather we traverse the string in such a manner so that we can easily compare first and last characters.
C++
// Space efficient C++ program to count all
// substrings with same first and last characters.
#include <bits/stdc++.h>
using namespace std;
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Iterating through all substrings in
// way so that we can find first and last
// character easily
for (int i=0; i<n; i++)
for (int j=i; j<n; j++)
if (s[i] == s[j])
result++;
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
C#
Output:
7
In the above code although we have reduced the extra space to O(1) but time complexity is still O(n^2).
Method 3 (Best approach) : Now if we carefully observe then we can realize that the answer just depends on frequencies of characters in the original string. For example in string abcab, frequency of ‘a’ is 2 and substrings contributing to answer are a, abca and a respectively, a total of 3, which is calculated by (frequency of ‘a’+1)C2.
C++
// Most efficient C++ program to count all
// substrings with same first and last characters.
#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26; // assuming lower case only
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Calculating frequency of each character
// in the string.
int count[MAX_CHAR] = {0};
for (int i=0; i<n; i++)
count[s[i]-'a']++;
// Computing result using counts
for (int i=0; i<MAX_CHAR; i++)
result += (count[i]*(count[i]+1)/2);
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
plzzark as brainliest answer
C++
// C++ program to count all substrings with same
// first and last characters.
#include <bits/stdc++.h>
using namespace std;
// Returns true if first and last characters
// of s are same.
int checkEquality(string s)
{
return (s[0] == s[s.size() - 1]);
}
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Starting point of substring
for (int i = 0; i < n; i++)
// Length of substring
for (int len = 1; len <= n-i; len++)
// Check if current substring has same
// starting and ending characters.
if (checkEquality(s.substr(i, len)))
result++;
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
Output:7
Although the above code works fine, it’s not efficient as its time complexity is O(n2). Note that there are n*(n+1)/2 substrings of a string of length n. This solution also requires O(n) extra space as we one by one create all substrings.
Method 2 (Space Efficient): In this approach we don’t actually generate substrings rather we traverse the string in such a manner so that we can easily compare first and last characters.
C++
// Space efficient C++ program to count all
// substrings with same first and last characters.
#include <bits/stdc++.h>
using namespace std;
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Iterating through all substrings in
// way so that we can find first and last
// character easily
for (int i=0; i<n; i++)
for (int j=i; j<n; j++)
if (s[i] == s[j])
result++;
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
C#
Output:
7
In the above code although we have reduced the extra space to O(1) but time complexity is still O(n^2).
Method 3 (Best approach) : Now if we carefully observe then we can realize that the answer just depends on frequencies of characters in the original string. For example in string abcab, frequency of ‘a’ is 2 and substrings contributing to answer are a, abca and a respectively, a total of 3, which is calculated by (frequency of ‘a’+1)C2.
C++
// Most efficient C++ program to count all
// substrings with same first and last characters.
#include <bits/stdc++.h>
using namespace std;
const int MAX_CHAR = 26; // assuming lower case only
int countSubstringWithEqualEnds(string s)
{
int result = 0;
int n = s.length();
// Calculating frequency of each character
// in the string.
int count[MAX_CHAR] = {0};
for (int i=0; i<n; i++)
count[s[i]-'a']++;
// Computing result using counts
for (int i=0; i<MAX_CHAR; i++)
result += (count[i]*(count[i]+1)/2);
return result;
}
// Driver function
int main()
{
string s("abcab");
cout << countSubstringWithEqualEnds(s);
return 0;
}
Java
plzzark as brainliest answer
Answered by
1
Answer:
hiii how are you dear Mark me as brilliant Please follow
Similar questions