0% found this document useful (0 votes)
2 views41 pages

Array Medium Soln

The document provides solutions in C++, Java, and Python for various algorithmic problems, including finding maximum scores from subarray minimums, counting maximums, and partitioning subsets. Each problem is accompanied by code implementations for different programming languages, demonstrating common algorithmic techniques such as sorting, dynamic programming, and sliding window. The document also includes a copyright notice from KN Academy Courses.

Uploaded by

samad1419imam
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views41 pages

Array Medium Soln

The document provides solutions in C++, Java, and Python for various algorithmic problems, including finding maximum scores from subarray minimums, counting maximums, and partitioning subsets. Each problem is accompanied by code implementations for different programming languages, demonstrating common algorithmic techniques such as sorting, dynamic programming, and sliding window. The document also includes a copyright notice from KN Academy Courses.

Uploaded by

samad1419imam
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

Q1.

Maximum Score from Subarray Minimums

C++ Solution
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
int pairWithMaxSum(vector<int>& arr) {
int n = [Link]();
int maxSum = 0;

for (int i = 1; i < n; i++) {


maxSum = max(maxSum, arr[i] + arr[i-1]);
}

return maxSum;
}
};

Java Solution

java
import [Link].*;

class Solution {
public int pairWithMaxSum(List<Integer> arr) {
int n = [Link]();
int maxSum = 0;

for (int i = 1; i < n; i++) {


maxSum = [Link](maxSum, [Link](i) + [Link](i-1));
}

Material Copyrighted @KNACADEMYCOURSES


return maxSum;
}
}

Python Solution

python
class Solution:
def pairWithMaxSum(self, arr):
n = len(arr)
max_sum = 0

for i in range(1, n):


max_sum = max(max_sum, arr[i] + arr[i-1])

return max_sum

Q2. Max-so-far Count Problem

C++ Solution

cpp
#include <iostream>
#include <climits>
using namespace std;

int main() {
int n;
cin >> n;

if (n < 1 || n > 20) {


cout << "Invalid input size" << endl;
return 1;
}

int count = 0;
int maxSoFar = INT_MIN;

Material Copyrighted @KNACADEMYCOURSES


for (int i = 0; i < n; i++) {
int num;
cin >> num;

if (num > maxSoFar) {


maxSoFar = num;
count++;
}
}

cout << count << endl;


return 0;
}

Java Solution

java
import [Link];

public class Main {


public static void main(String[] args) {
Scanner sc = new Scanner([Link]);

int n = [Link]();

if (n < 1 || n > 20) {


[Link]("Invalid input size");
return;
}

int count = 0;
int maxSoFar = Integer.MIN_VALUE;

Material Copyrighted @KNACADEMYCOURSES


for (int i = 0; i < n; i++) {
int num = [Link]();

if (num > maxSoFar) {


maxSoFar = num;
count++;
}
}

[Link](count);
[Link]();
}
}

Python Solution

python
def main():
n = int(input())

if n < 1 or n > 20:


print("Invalid input size")
return

count = 0
max_so_far = float('-inf')

for _ in range(n):
num = int(input())
if num > max_so_far:
max_so_far = num
count += 1

print(count)

Material Copyrighted @KNACADEMYCOURSES


if __name__ == "__main__":
main()

Q3. 3 Sum

C++ Solution

cpp
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int n = [Link]();

if (n < 3) return result;

sort([Link](), [Link]());

for (int i = 0; i < n - 2; i++) {


if (i > 0 && nums[i] == nums[i-1]) continue;

int left = i + 1;
int right = n - 1;

while (left < right) {


int sum = nums[i] + nums[left] + nums[right];

if (sum == 0) {
result.push_back({nums[i], nums[left],
nums[right]});

Material Copyrighted @KNACADEMYCOURSES


while (left < right && nums[left] ==
nums[left+1]) left++;
while (left < right && nums[right] ==
nums[right-1]) right--;

left++;
right--;
}
else if (sum < 0) {
left++;
}
else {
right--;
}
}
}

return result;
}
};

Java Solution

java
import [Link].*;

class Solution {
public List<List<Integer>> threeSum(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
int n = [Link];

if (n < 3) return result;

[Link](nums);

Material Copyrighted @KNACADEMYCOURSES


for (int i = 0; i < n - 2; i++) {
if (i > 0 && nums[i] == nums[i-1]) continue;

int left = i + 1;
int right = n - 1;

while (left < right) {


int sum = nums[i] + nums[left] + nums[right];

if (sum == 0) {
[Link]([Link](nums[i], nums[left],
nums[right]));

while (left < right && nums[left] ==


nums[left+1]) left++;
while (left < right && nums[right] ==
nums[right-1]) right--;

left++;
right--;
}
else if (sum < 0) {
left++;
}
else {
right--;
}
}
}

return result;
}
}

Python Solution

Material Copyrighted @KNACADEMYCOURSES


python
class Solution:
def threeSum(self, nums):
result = []
n = len(nums)

if n < 3:
return result

[Link]()

for i in range(n - 2):


if i > 0 and nums[i] == nums[i-1]:
continue

left, right = i + 1, n - 1

while left < right:


total = nums[i] + nums[left] + nums[right]

if total == 0:
[Link]([nums[i], nums[left],
nums[right]])

while left < right and nums[left] ==


nums[left+1]:
left += 1
while left < right and nums[right] ==
nums[right-1]:
right -= 1

left += 1
right -= 1
elif total < 0:

Material Copyrighted @KNACADEMYCOURSES


left += 1
else:
right -= 1

return result

Q4. Partition Equal Subset Sum

C++ Solution

cpp
#include <vector>
using namespace std;

class Solution {
public:
int equalPartition(int N, int arr[]) {
int sum = 0;
for (int i = 0; i < N; i++) {
sum += arr[i];
}

if (sum % 2 != 0) return 0;

int target = sum / 2;


vector<vector<bool>> dp(N + 1, vector<bool>(target + 1,
false));

for (int i = 0; i <= N; i++) {


dp[i][0] = true;
}

for (int i = 1; i <= N; i++) {


for (int j = 1; j <= target; j++) {
if (arr[i-1] <= j) {
dp[i][j] = dp[i-1][j] || dp[i-1][j - arr[i-1]];

Material Copyrighted @KNACADEMYCOURSES


} else {
dp[i][j] = dp[i-1][j];
}
}
}

return dp[N][target] ? 1 : 0;
}
};

Java Solution

java
class Solution {
static int equalPartition(int N, int arr[]) {
int sum = 0;
for (int i = 0; i < N; i++) {
sum += arr[i];
}

if (sum % 2 != 0) return 0;

int target = sum / 2;


boolean[][] dp = new boolean[N + 1][target + 1];

for (int i = 0; i <= N; i++) {


dp[i][0] = true;
}

for (int i = 1; i <= N; i++) {


for (int j = 1; j <= target; j++) {
if (arr[i-1] <= j) {
dp[i][j] = dp[i-1][j] || dp[i-1][j - arr[i-1]];
} else {

Material Copyrighted @KNACADEMYCOURSES


dp[i][j] = dp[i-1][j];
}
}
}

return dp[N][target] ? 1 : 0;
}
}

Python Solution

python
class Solution:
def equalPartition(self, N, arr):
total = sum(arr)

if total % 2 != 0:
return 0

target = total // 2
dp = [[False] * (target + 1) for _ in range(N + 1)]

for i in range(N + 1):


dp[i][0] = True

for i in range(1, N + 1):


for j in range(1, target + 1):
if arr[i-1] <= j:
dp[i][j] = dp[i-1][j] or dp[i-1][j - arr[i-1]]
else:
dp[i][j] = dp[i-1][j]

return 1 if dp[N][target] else 0

Q5. Rotate Matrix By 90 Degree

Material Copyrighted @KNACADEMYCOURSES


C++ Solution

cpp
#include <vector>
using namespace std;

class Solution {
public:
void rotate(vector<vector<int>>& matrix) {
int n = [Link]();

// Transpose
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
swap(matrix[i][j], matrix[j][i]);
}
}

// Reverse each row


for (int i = 0; i < n; i++) {
reverse(matrix[i].begin(), matrix[i].end());
}
}
};

Java Solution

java
class Solution {
public void rotate(int[][] matrix) {
int n = [Link];

// Transpose
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {

Material Copyrighted @KNACADEMYCOURSES


int temp = matrix[i][j];
matrix[i][j] = matrix[j][i];
matrix[j][i] = temp;
}
}

// Reverse each row


for (int i = 0; i < n; i++) {
for (int j = 0; j < n / 2; j++) {
int temp = matrix[i][j];
matrix[i][j] = matrix[i][n - 1 - j];
matrix[i][n - 1 - j] = temp;
}
}
}
}

Python Solution

python
class Solution:
def rotate(self, matrix):
n = len(matrix)

# Transpose
for i in range(n):
for j in range(i + 1, n):
matrix[i][j], matrix[j][i] = matrix[j][i],
matrix[i][j]

# Reverse each row


for i in range(n):
matrix[i].reverse()

Q6. Best Time to Buy and Sell Stock

C++ Solution

Material Copyrighted @KNACADEMYCOURSES


cpp
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int maximumProfit(vector<int> &prices) {


int n = [Link]();
if (n <= 1) return 0;

int minPrice = prices[0];


int maxProfit = 0;

for (int i = 1; i < n; i++) {


minPrice = min(minPrice, prices[i]);
maxProfit = max(maxProfit, prices[i] - minPrice);
}

return maxProfit;
}

Java Solution

java
import [Link];

public class Solution {


public static int maximumProfit(ArrayList<Integer> prices) {
int n = [Link]();
if (n <= 1) return 0;

int minPrice = [Link](0);


int maxProfit = 0;

Material Copyrighted @KNACADEMYCOURSES


for (int i = 1; i < n; i++) {
minPrice = [Link](minPrice, [Link](i));
maxProfit = [Link](maxProfit, [Link](i) -
minPrice);
}

return maxProfit;
}
}

Python Solution

python
def maximumProfit(prices):
n = len(prices)
if n <= 1:
return 0

min_price = prices[0]
max_profit = 0

for i in range(1, n):


min_price = min(min_price, prices[i])
max_profit = max(max_profit, prices[i] - min_price)

return max_profit

Q7. Minimum Swaps

C++ Solution

cpp
#include <vector>
#include <algorithm>
using namespace std;

int minimumSwaps(vector<int> &arr, int n, int k) {


int count = 0;

Material Copyrighted @KNACADEMYCOURSES


for (int i = 0; i < n; i++) {
if (arr[i] <= k) count++;
}

if (count == 0) return 0;

int bad = 0;
for (int i = 0; i < count; i++) {
if (arr[i] > k) bad++;
}

int minSwaps = bad;

for (int i = count; i < n; i++) {


if (arr[i - count] > k) bad--;
if (arr[i] > k) bad++;
minSwaps = min(minSwaps, bad);
}

return minSwaps;
}

Java Solution

java
import [Link];

public class Solution {


public static int minimumSwaps(ArrayList<Integer> arr, int n,
int k) {
int count = 0;
for (int i = 0; i < n; i++) {
if ([Link](i) <= k) count++;
}

Material Copyrighted @KNACADEMYCOURSES


if (count == 0) return 0;

int bad = 0;
for (int i = 0; i < count; i++) {
if ([Link](i) > k) bad++;
}

int minSwaps = bad;

for (int i = count; i < n; i++) {


if ([Link](i - count) > k) bad--;
if ([Link](i) > k) bad++;
minSwaps = [Link](minSwaps, bad);
}

return minSwaps;
}
}

Python Solution

python
def minimumSwaps(arr, n, k):
count = sum(1 for x in arr if x <= k)

if count == 0:
return 0

bad = sum(1 for i in range(count) if arr[i] > k)


min_swaps = bad

for i in range(count, n):


if arr[i - count] > k:
bad -= 1

Material Copyrighted @KNACADEMYCOURSES


if arr[i] > k:
bad += 1
min_swaps = min(min_swaps, bad)

return min_swaps

Q8. Chocolate Problem

C++ Solution

cpp
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

int findMinDiff(int n, int m, vector<int> chocolates) {


if (m == 0 || n == 0) return 0;
if (n < m) return -1;

sort([Link](), [Link]());

int minDiff = INT_MAX;

for (int i = 0; i + m - 1 < n; i++) {


int diff = chocolates[i + m - 1] - chocolates[i];
minDiff = min(minDiff, diff);
}

return minDiff;
}

Java Solution

java
import [Link].*;

Material Copyrighted @KNACADEMYCOURSES


public class Solution {
static int findMinDiff(int n, int m, ArrayList<Integer>
chocolates) {
if (m == 0 || n == 0) return 0;
if (n < m) return -1;

[Link](chocolates);

int minDiff = Integer.MAX_VALUE;

for (int i = 0; i + m - 1 < n; i++) {


int diff = [Link](i + m - 1) -
[Link](i);
minDiff = [Link](minDiff, diff);
}

return minDiff;
}
}

Python Solution

python
def findMinDiff(n, m, chocolates):
if m == 0 or n == 0:
return 0
if n < m:
return -1

[Link]()

min_diff = float('inf')

for i in range(n - m + 1):


diff = chocolates[i + m - 1] - chocolates[i]

Material Copyrighted @KNACADEMYCOURSES


min_diff = min(min_diff, diff)

return min_diff

Q9. Trapping Rain Water

C++ Solution

cpp
#include <vector>
#include <algorithm>
using namespace std;

long long getTrappedWater(long long* arr, int n) {


if (n <= 2) return 0;

vector<long long> leftMax(n), rightMax(n);

leftMax[0] = arr[0];
for (int i = 1; i < n; i++) {
leftMax[i] = max(leftMax[i-1], arr[i]);
}

rightMax[n-1] = arr[n-1];
for (int i = n-2; i >= 0; i--) {
rightMax[i] = max(rightMax[i+1], arr[i]);
}

long long water = 0;


for (int i = 0; i < n; i++) {
water += min(leftMax[i], rightMax[i]) - arr[i];
}

return water;
}

Material Copyrighted @KNACADEMYCOURSES


Java Solution

java
public class Solution {
public static long getTrappedWater(long[] arr, int n) {
if (n <= 2) return 0;

long[] leftMax = new long[n];


long[] rightMax = new long[n];

leftMax[0] = arr[0];
for (int i = 1; i < n; i++) {
leftMax[i] = [Link](leftMax[i-1], arr[i]);
}

rightMax[n-1] = arr[n-1];
for (int i = n-2; i >= 0; i--) {
rightMax[i] = [Link](rightMax[i+1], arr[i]);
}

long water = 0;
for (int i = 0; i < n; i++) {
water += [Link](leftMax[i], rightMax[i]) - arr[i];
}

return water;
}
}

Python Solution

python
def getTrappedWater(arr, n):
if n <= 2:
return 0

Material Copyrighted @KNACADEMYCOURSES


left_max = [0] * n
right_max = [0] * n

left_max[0] = arr[0]
for i in range(1, n):
left_max[i] = max(left_max[i-1], arr[i])

right_max[n-1] = arr[n-1]
for i in range(n-2, -1, -1):
right_max[i] = max(right_max[i+1], arr[i])

water = 0
for i in range(n):
water += min(left_max[i], right_max[i]) - arr[i]

return water

Q10. Kth Smallest

C++ Solution

cpp
#include <vector>
#include <queue>
using namespace std;

class Solution {
public:
int kthSmallest(int arr[], int l, int r, int k) {
priority_queue<int> maxHeap;

for (int i = l; i <= r; i++) {


[Link](arr[i]);
if ([Link]() > k) {

Material Copyrighted @KNACADEMYCOURSES


[Link]();
}
}

return [Link]();
}
};

Java Solution

java
import [Link].*;

class Solution {
public static int kthSmallest(int[] arr, int l, int r, int k) {
PriorityQueue<Integer> maxHeap = new
PriorityQueue<>([Link]());

for (int i = l; i <= r; i++) {


[Link](arr[i]);
if ([Link]() > k) {
[Link]();
}
}

return [Link]();
}
}

Python Solution

python
import heapq

class Solution:
def kthSmallest(self, arr, l, r, k):
max_heap = []

Material Copyrighted @KNACADEMYCOURSES


for i in range(l, r + 1):
[Link](max_heap, -arr[i])
if len(max_heap) > k:
[Link](max_heap)

return -max_heap[0]

Q11. Minimum Platforms

C++ Solution

cpp
#include <vector>
#include <algorithm>
using namespace std;

int findPlatform(int arr[], int dep[], int n) {


sort(arr, arr + n);
sort(dep, dep + n);

int platforms = 1, result = 1;


int i = 1, j = 0;

while (i < n && j < n) {


if (arr[i] <= dep[j]) {
platforms++;
i++;
} else {
platforms--;
j++;
}
result = max(result, platforms);
}

Material Copyrighted @KNACADEMYCOURSES


return result;
}

Java Solution

java
import [Link].*;

class GFG {
public static int findPlatform(int arr[], int dep[], int n) {
[Link](arr);
[Link](dep);

int platforms = 1, result = 1;


int i = 1, j = 0;

while (i < n && j < n) {


if (arr[i] <= dep[j]) {
platforms++;
i++;
} else {
platforms--;
j++;
}
result = [Link](result, platforms);
}

return result;
}
}
Python Solution
python
def findPlatform(arr, dep, n):
[Link]()

Material Copyrighted @KNACADEMYCOURSES


[Link]()

platforms = 1
result = 1
i, j = 1, 0

while i < n and j < n:


if arr[i] <= dep[j]:
platforms += 1
i += 1
else:
platforms -= 1
j += 1
result = max(result, platforms)

return result

Q12. Stock Span Problem

C++ Solution

cpp
#include <vector>
#include <stack>
using namespace std;

vector<int> calculateSpan(int price[], int n) {


vector<int> span(n);
stack<int> st;

[Link](0);
span[0] = 1;

for (int i = 1; i < n; i++) {


while (![Link]() && price[[Link]()] <= price[i]) {

Material Copyrighted @KNACADEMYCOURSES


[Link]();
}

span[i] = [Link]() ? i + 1 : i - [Link]();


[Link](i);
}

return span;
}

Java Solution

java
import [Link].*;

class GFG {
static int[] calculateSpan(int price[], int n) {
int[] span = new int[n];
Stack<Integer> st = new Stack<>();

[Link](0);
span[0] = 1;

for (int i = 1; i < n; i++) {


while (![Link]() && price[[Link]()] <= price[i]) {
[Link]();
}

span[i] = [Link]() ? i + 1 : i - [Link]();


[Link](i);
}

return span;
}

Material Copyrighted @KNACADEMYCOURSES


}

Python Solution

python
def calculateSpan(price, n):
span = [0] * n
stack = []

[Link](0)
span[0] = 1

for i in range(1, n):


while stack and price[stack[-1]] <= price[i]:
[Link]()

span[i] = i + 1 if not stack else i - stack[-1]


[Link](i)

return span

Q13. Travelling Salesman Problem

C++ Solution

cpp
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

class Solution {
public:
int total_cost(vector<vector<int>> cost) {
int n = [Link]();
vector<vector<int>> dp(1 << n, vector<int>(n, -1));

Material Copyrighted @KNACADEMYCOURSES


return tsp(1, 0, cost, dp);
}

private:
int tsp(int mask, int pos, vector<vector<int>>& cost,
vector<vector<int>>& dp) {
int n = [Link]();

if (mask == (1 << n) - 1) {
return cost[pos][0];
}

if (dp[mask][pos] != -1) {
return dp[mask][pos];
}

int ans = INT_MAX;

for (int city = 0; city < n; city++) {


if ((mask & (1 << city)) == 0) {
int newCost = cost[pos][city] + tsp(mask | (1 <<
city), city, cost, dp);
ans = min(ans, newCost);
}
}

return dp[mask][pos] = ans;


}
};

Java Solution

java
import [Link].*;

Material Copyrighted @KNACADEMYCOURSES


class Solution {
public int total_cost(int[][] cost) {
int n = [Link];
int[][] dp = new int[1 << n][n];

for (int[] row : dp) {


[Link](row, -1);
}

return tsp(1, 0, cost, dp);


}

private int tsp(int mask, int pos, int[][] cost, int[][] dp) {
int n = [Link];

if (mask == (1 << n) - 1) {
return cost[pos][0];
}

if (dp[mask][pos] != -1) {
return dp[mask][pos];
}

int ans = Integer.MAX_VALUE;

for (int city = 0; city < n; city++) {


if ((mask & (1 << city)) == 0) {
int newCost = cost[pos][city] + tsp(mask | (1 <<
city), city, cost, dp);
ans = [Link](ans, newCost);
}
}

Material Copyrighted @KNACADEMYCOURSES


return dp[mask][pos] = ans;
}
}

Python Solution

python
class Solution:
def total_cost(self, cost):
n = len(cost)
dp = [[-1] * n for _ in range(1 << n)]

return [Link](1, 0, cost, dp)

def tsp(self, mask, pos, cost, dp):


n = len(cost)

if mask == (1 << n) - 1:
return cost[pos][0]

if dp[mask][pos] != -1:
return dp[mask][pos]

ans = float('inf')

for city in range(n):


if (mask & (1 << city)) == 0:
new_cost = cost[pos][city] + [Link](mask | (1 <<
city), city, cost, dp)
ans = min(ans, new_cost)

dp[mask][pos] = ans
return ans

Q14. Cake Distribution Problem

C++ Solution

Material Copyrighted @KNACADEMYCOURSES


cpp
#include <vector>
#include <algorithm>
#include <climits>
using namespace std;

class Solution {
public:
int maxSweetness(vector<int>& sweetness, int n, int k) {
int low = *min_element([Link](), [Link]());
int high = 0;
for (int s : sweetness) high += s;

int result = low;

while (low <= high) {


int mid = low + (high - low) / 2;

if (canSplit(sweetness, n, k + 1, mid)) {
result = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}

return result;
}

private:
bool canSplit(vector<int>& sweetness, int n, int pieces, int
minSweetness) {
int current = 0;

Material Copyrighted @KNACADEMYCOURSES


int count = 0;

for (int i = 0; i < n; i++) {


current += sweetness[i];
if (current >= minSweetness) {
count++;
current = 0;
}
}

return count >= pieces;


}
};

Java Solution

java
import [Link].*;

class Solution {
int maxSweetness(int[] sweetness, int n, int k) {
int low = Integer.MAX_VALUE;
int high = 0;

for (int s : sweetness) {


low = [Link](low, s);
high += s;
}

int result = low;

while (low <= high) {


int mid = low + (high - low) / 2;

Material Copyrighted @KNACADEMYCOURSES


if (canSplit(sweetness, n, k + 1, mid)) {
result = mid;
low = mid + 1;
} else {
high = mid - 1;
}
}

return result;
}

private boolean canSplit(int[] sweetness, int n, int pieces, int


minSweetness) {
int current = 0;
int count = 0;

for (int i = 0; i < n; i++) {


current += sweetness[i];
if (current >= minSweetness) {
count++;
current = 0;
}
}

return count >= pieces;


}
}

Python Solution

python
class Solution:
def maxSweetness(self, sweetness, n, k):
low = min(sweetness)
high = sum(sweetness)

Material Copyrighted @KNACADEMYCOURSES


result = low

while low <= high:


mid = (low + high) // 2

if self.can_split(sweetness, n, k + 1, mid):
result = mid
low = mid + 1
else:
high = mid - 1

return result

def can_split(self, sweetness, n, pieces, min_sweetness):


current = 0
count = 0

for i in range(n):
current += sweetness[i]
if current >= min_sweetness:
count += 1
current = 0

return count >= pieces

Q15. Little Bear and Strings

C++ Solution

cpp
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <set>

Material Copyrighted @KNACADEMYCOURSES


using namespace std;

class Solution {
public:
int countDistinctGoodSubstrings(string s, string t1, string t2)
{
int n = [Link]();
int l1 = [Link](), l2 = [Link]();

vector<int> startPositions, endPositions;

// Find all positions where t1 starts


for (int i = 0; i <= n - l1; i++) {
if ([Link](i, l1) == t1) {
startPositions.push_back(i);
}
}

// Find all positions where t2 ends


for (int i = l2 - 1; i < n; i++) {
if ([Link](i - l2 + 1, l2) == t2) {
endPositions.push_back(i);
}
}

if ([Link]() || [Link]()) {
return 0;
}

set<string> distinctSubstrings;

for (int start : startPositions) {


for (int end : endPositions) {

Material Copyrighted @KNACADEMYCOURSES


if (end >= start) {
[Link]([Link](start, end -
start + 1));
}
}
}

return [Link]();
}
};

int main() {
Solution sol;
string s, t1, t2;

while (getline(cin, s) && getline(cin, t1) && getline(cin, t2))


{
cout << [Link](s, t1, t2) << endl;
}

return 0;
}

Java Solution

java
import [Link].*;

class Solution {
public int countDistinctGoodSubstrings(String s, String t1,
String t2) {
int n = [Link]();
int l1 = [Link](), l2 = [Link]();

List<Integer> startPositions = new ArrayList<>();

Material Copyrighted @KNACADEMYCOURSES


List<Integer> endPositions = new ArrayList<>();

// Find all positions where t1 starts


for (int i = 0; i <= n - l1; i++) {
if ([Link](i, i + l1).equals(t1)) {
[Link](i);
}
}

// Find all positions where t2 ends


for (int i = l2 - 1; i < n; i++) {
if ([Link](i - l2 + 1, i + 1).equals(t2)) {
[Link](i);
}
}

if ([Link]() || [Link]()) {
return 0;
}

Set<String> distinctSubstrings = new HashSet<>();

for (int start : startPositions) {


for (int end : endPositions) {
if (end >= start) {
[Link]([Link](start, end +
1));
}
}
}

return [Link]();
}

Material Copyrighted @KNACADEMYCOURSES


public static void main(String[] args) {
Scanner sc = new Scanner([Link]);
Solution sol = new Solution();

while ([Link]()) {
String s = [Link]();
if (![Link]()) break;
String t1 = [Link]();
if (![Link]()) break;
String t2 = [Link]();

[Link]([Link](s,
t1, t2));
}

[Link]();
}
}

Python Solution

python
class Solution:
def countDistinctGoodSubstrings(self, s, t1, t2):
n = len(s)
l1, l2 = len(t1), len(t2)

start_positions = []
end_positions = []

# Find all positions where t1 starts


for i in range(n - l1 + 1):
if s[i:i + l1] == t1:
start_positions.append(i)

Material Copyrighted @KNACADEMYCOURSES


# Find all positions where t2 ends
for i in range(l2 - 1, n):
if s[i - l2 + 1:i + 1] == t2:
end_positions.append(i)

if not start_positions or not end_positions:


return 0

distinct_substrings = set()

for start in start_positions:


for end in end_positions:
if end >= start:
distinct_substrings.add(s[start:end + 1])

return len(distinct_substrings)

def main():
import sys
sol = Solution()
lines = [[Link]() for line in [Link] if [Link]()]

for i in range(0, len(lines), 3):


if i + 2 < len(lines):
s = lines[i]
t1 = lines[i + 1]
t2 = lines[i + 2]
print([Link](s, t1, t2))

if __name__ == "__main__":
main()

Material Copyrighted @KNACADEMYCOURSES


Material Copyrighted @KNACADEMYCOURSES

You might also like