Given a string str and a positive integer K. The task is to find if there exist a Pythagorean Triples in the first window of size K of a string which have the same characters as str but is largest in lexicographical order.
Note: Every character is in lower case and consider the following values for each alphabet to check if there exist Pythagorean triples: a = 1, b = 2, . . ., y = 25, z = 26.
A triplet(ch1, ch2, ch3) is called Pythagorean triples if (ch1)2+ (ch2)2 = (ch3)2.
Examples:
Input: str = “abxczde”, K = 4
Output: NO
Explanation: The lexicographically largest string having the same characters is zxedcba.
The first window of size 4 is “zxed”, which does not contain any such triplet.Input: str = “abcdef”, K = 4
Output: YES
Explanation: The lexicographically largest string possible is “fedcba”.
The first window of size 4 has “fedc” which have a triplet (c, d, e) that is Pythagorean.Input: str = “dce”, K = 2
Output: NO
Explanation: As window size is less than 3, choosing a triple is not possible.
Approach: This problem can be solved using Greedy algorithm. Follow the steps below for approach:
- Sort the given string in descending order.
- In the substring 0 to K-1, check if there exists any lexicographical Pythagorean triplet, using two pointer approach.
- If any such triplet is found, print Yes and return. Else print No.
Below is the implementation of the approach:
// C++ code to implement the above approach #include <bits/stdc++.h> using namespace std;
// Function to check for // Lexicographical Pythagorean triplet bool Pythagorean(string s, int k)
{ // If k is less than 3 no triple possible
if (k < 3) {
return false ;
}
// Sort the string in descending order
sort(s.begin(), s.end(), greater< char >());
// Loop to check Pythagorean triples
for ( int i = 0; i < k - 2; ++i) {
// Variables to define boundary of window
int r = k - 1;
int l = i + 1;
// Loop for using two pointer approach
// to find the other two elements
while (r > l) {
int a = pow (s[i] - 'a' + 1, 2);
int b = pow (s[l] - 'a' + 1, 2);
int c = pow (s[r] - 'a' + 1, 2);
// If triple is found
if (a == b + c) {
return true ;
}
// If 'a' is greater
else if (a > b + c) {
r--;
}
// If 'a' is less
else
l++;
}
}
// No such triple found
return false ;
} // Driver code int main()
{ string str = "abcdef" ;
int K = 4;
bool ans = Pythagorean(str, K);
if (ans)
cout << "YES" ;
else
cout << "NO" ;
return 0;
} |
// Java code to implement the above approach import java.util.*;
public class GFG
{ // Utility function to reverse an array static void reverse( char [] a)
{ int i, n = a.length;
char t;
for (i = 0 ; i < n / 2 ; i++)
{
t = a[i];
a[i] = a[n - i - 1 ];
a[n - i - 1 ] = t;
}
} // Function to check for // Lexicographical Pythagorean triplet static boolean Pythagorean(String str, int k)
{ // If k is less than 3 no triple possible
if (k < 3 ) {
return false ;
}
// Sort the string in descending order
char [] s = str.toCharArray();
Arrays.sort(s);
reverse(s);
// Loop to check Pythagorean triples
for ( int i = 0 ; i < k - 2 ; ++i) {
// Variables to define boundary of window
int r = k - 1 ;
int l = i + 1 ;
// Loop for using two pointer approach
// to find the other two elements
while (r > l) {
int a = ( int )Math.pow(s[i] - 'a' + 1 , 2 );
int b = ( int )Math.pow(s[l] - 'a' + 1 , 2 );
int c = ( int )Math.pow(s[r] - 'a' + 1 , 2 );
// If triple is found
if (a == b + c) {
return true ;
}
// If 'a' is greater
else if (a > b + c) {
r--;
}
// If 'a' is less
else
l++;
}
}
// No such triple found
return false ;
} // Driver code public static void main(String args[])
{ String str = "abcdef" ;
int K = 4 ;
boolean ans = Pythagorean(str, K);
if (ans)
System.out.println( "YES" );
else
System.out.println( "NO" );
} } // This code is contributed by Samim Hossain Mondal. |
# Python Program to implement # the above approach # Function to check for # Lexicographical Pythagorean triplet def Pythagorean(st, k):
# If k is less than 3 no triple possible
if (k < 3 ):
return False
# Sort the string in descending order
s = []
for i in range ( len (st)):
s.append(st[i])
s.sort()
s.reverse()
# Loop to check Pythagorean triples
for i in range (k - 2 ):
# Variables to define boundary of window
r = k - 1
l = i + 1
# Loop for using two pointer approach
# to find the other two elements
while (r > l):
a = pow ( ord (s[i]) - ord ( 'a' ) + 1 , 2 )
b = pow ( ord (s[l]) - ord ( 'a' ) + 1 , 2 )
c = pow ( ord (s[r]) - ord ( 'a' ) + 1 , 2 )
# If triple is found
if (a = = b + c):
return True
# If 'a' is greater
elif (a > b + c) :
r - = 1
# If 'a' is less
else :
l + = 1
# No such triple found
return False
# Driver code str = "abcdef"
K = 4
ans = Pythagorean( str , K)
if (ans):
print ( "YES" )
else :
print ( "NO" )
# This code is contributed by gfgking |
// C# code to implement the above approach using System;
public class GFG
{ // Utility function to reverse an array static void reverse( char [] a)
{ int i, n = a.Length;
char t;
for (i = 0; i < n / 2; i++)
{
t = a[i];
a[i] = a[n - i - 1];
a[n - i - 1] = t;
}
} // Function to check for // Lexicographical Pythagorean triplet static bool Pythagorean( string str, int k)
{ // If k is less than 3 no triple possible
if (k < 3) {
return false ;
}
// Sort the string in descending order
char [] s = str.ToCharArray();
Array.Sort(s);
reverse(s);
// Loop to check Pythagorean triples
for ( int i = 0; i < k - 2; ++i) {
// Variables to define boundary of window
int r = k - 1;
int l = i + 1;
// Loop for using two pointer approach
// to find the other two elements
while (r > l) {
int a = ( int )Math.Pow(s[i] - 'a' + 1, 2);
int b = ( int )Math.Pow(s[l] - 'a' + 1, 2);
int c = ( int )Math.Pow(s[r] - 'a' + 1, 2);
// If triple is found
if (a == b + c) {
return true ;
}
// If 'a' is greater
else if (a > b + c) {
r--;
}
// If 'a' is less
else
l++;
}
}
// No such triple found
return false ;
} // Driver code public static void Main()
{ string str = "abcdef" ;
int K = 4;
bool ans = Pythagorean(str, K);
if (ans)
Console.Write( "YES" );
else
Console.Write( "NO" );
} } // This code is contributed by Samim Hossain Mondal. |
<script> // JavaScript Program to implement
// the above approach
// Function to check for
// Lexicographical Pythagorean triplet
function Pythagorean(st, k)
{
// If k is less than 3 no triple possible
if (k < 3) {
return false ;
}
// Sort the string in descending order
s = [];
for (let i = 0; i < st.length; i++) { s.push(st.charAt(i)); }
s.sort( function (a, b) { return b.charCodeAt(0) - a.charCodeAt(0) })
// Loop to check Pythagorean triples
for (let i = 0; i < k - 2; ++i) {
// Variables to define boundary of window
let r = k - 1;
let l = i + 1;
// Loop for using two pointer approach
// to find the other two elements
while (r > l) {
let a = Math.pow(s[i].charCodeAt(0) - 'a' .charCodeAt(0) + 1, 2);
let b = Math.pow(s[l].charCodeAt(0) - 'a' .charCodeAt(0) + 1, 2);
let c = Math.pow(s[r].charCodeAt(0) - 'a' .charCodeAt(0) + 1, 2);
5
// If triple is found
if (a == b + c) {
return true ;
}
// If 'a' is greater
else if (a > b + c) {
r--;
}
// If 'a' is less
else
l++;
}
}
// No such triple found
return false ;
}
// Driver code
let str = "abcdef" ;
let K = 4;
let ans = Pythagorean(str, K);
if (ans)
document.write( "YES" );
else
document.write( "NO" );
// This code is contributed by Potta Lokesh
</script>
|
YES
Time Complexity: O(K2)
Auxiliary Space: O(1)