给定两个大小为N的数组A []和B [] ,任务是通过仅反转A的任何子数组一次来检查A []是否等于B [] 。
例子:
Input: A[] = {1, 3, 2, 4}
B[] = {1, 2, 3, 4}
Output: Yes
Explanation:
The sub-array {3, 2} can be reversed to {2, 3} which makes A equal to B
Input: A[] = {1, 4, 2, 3}
B[] = {1, 2, 3, 4}
Output: No
Explanation:
There is no sub-array of A which when reversed makes A equal to B
天真的方法:检查A []的所有子数组,并在反转子数组后比较两个数组。
时间复杂度: O(N 2 )。
高效方法:
- 首先找到A和B中不相等的子数组的开始和结束索引。
- 然后,通过反转所需的子数组,我们可以检查A是否可以等于B。
- 起始索引是A [i]!= B [i]的数组中的第一个索引,结束索引是A [i]!= B [i]的数组中的最后一个索引。
下面是上述方法的实现。
C++
// C++ implementation to
// check whether two arrays
// can be made equal by
// reversing a sub-array
// only once
#include
using namespace std;
// Function to check whether two arrays
// can be made equal by reversing
// a sub-array only once
void checkArray(int A[], int B[], int N)
{
// Integer variable for
// storing the required
// starting and ending
// indices in the array
int start = 0;
int end = N - 1;
// Finding the smallest index
// for which A[i] != B[i]
// i.e the starting index
// of the unequal sub-array
for (int i = 0; i < N; i++) {
if (A[i] != B[i]) {
start = i;
break;
}
}
// Finding the largest index
// for which A[i] != B[i]
// i.e the ending index
// of the unequal sub-array
for (int i = N - 1; i >= 0; i--) {
if (A[i] != B[i]) {
end = i;
break;
}
}
// Reversing the sub-array
// A[start], A[start+1] .. A[end]
reverse(A + start, A + end + 1);
// Checking whether on reversing
// the sub-array A[start]...A[end]
// makes the arrays equal
for (int i = 0; i < N; i++) {
if (A[i] != B[i]) {
// If any element of the
// two arrays is unequal
// print No and return
cout << "No" << endl;
return;
}
}
// Print Yes if arrays are
// equal after reversing
// the sub-array
cout << "Yes" << endl;
}
// Driver code
int main()
{
int A[] = { 1, 3, 2, 4 };
int B[] = { 1, 2, 3, 4 };
int N = sizeof(A) / sizeof(A[0]);
checkArray(A, B, N);
return 0;
}
Java
// Java implementation to
// check whether two arrays
// can be made equal by
// reversing a sub-array
// only once
import java.util.*;
class GFG{
// Function to check whether two arrays
// can be made equal by reversing
// a sub-array only once
static void checkArray(int A[], int B[], int N)
{
// Integer variable for
// storing the required
// starting and ending
// indices in the array
int start = 0;
int end = N - 1;
// Finding the smallest index
// for which A[i] != B[i]
// i.e the starting index
// of the unequal sub-array
for (int i = 0; i < N; i++)
{
if (A[i] != B[i])
{
start = i;
break;
}
}
// Finding the largest index
// for which A[i] != B[i]
// i.e the ending index
// of the unequal sub-array
for (int i = N - 1; i >= 0; i--)
{
if (A[i] != B[i])
{
end = i;
break;
}
}
// Reversing the sub-array
// A[start], A[start+1] .. A[end]
Collections.reverse(Arrays.asList(A));
// Checking whether on reversing
// the sub-array A[start]...A[end]
// makes the arrays equal
for (int i = 0; i < N; i++)
{
if (A[i] != B[i])
{
// If any element of the
// two arrays is unequal
// print No and return
System.out.println("Yes");
return;
}
}
// Print Yes if arrays are
// equal after reversing
// the sub-array
System.out.println("Yes");
}
// Driver code
public static void main(String[] args)
{
int A[] = { 1, 3, 2, 4 };
int B[] = { 1, 2, 3, 4 };
int N = A.length;
checkArray(A, B, N);
}
}
// This Code is contributed by rock_cool
Python3
# Python3 implementation to
# check whether two arrays
# can be made equal by
# reversing a sub-array
# only once
# Function to check whether two arrays
# can be made equal by reversing
# a sub-array only once
def checkArray(A, B, N):
# Integer variable for
# storing the required
# starting and ending
# indices in the array
start = 0
end = N - 1
# Finding the smallest index
# for which A[i] != B[i]
# i.e the starting index
# of the unequal sub-array
for i in range(N):
if (A[i] != B[i]):
start = i
break
# Finding the largest index
# for which A[i] != B[i]
# i.e the ending index
# of the unequal sub-array
for i in range(N - 1, -1, -1):
if (A[i] != B[i]):
end = i
break
# Reversing the sub-array
# A[start], A[start+1] .. A[end]
A[start:end + 1] = reversed(A[start:end + 1])
# Checking whether on reversing
# the sub-array A[start]...A[end]
# makes the arrays equal
for i in range(N):
if (A[i] != B[i]):
# If any element of the
# two arrays is unequal
# print No and return
print("No")
return
# Print Yes if arrays are
# equal after reversing
# the sub-array
print("Yes")
# Driver code
if __name__ == '__main__':
A = [ 1, 3, 2, 4 ]
B = [ 1, 2, 3, 4 ]
N = len(A)
checkArray(A, B, N)
# This code is contributed by mohit kumar 29
C#
// C# implementation to
// check whether two arrays
// can be made equal by
// reversing a sub-array
// only once
using System;
class GFG{
// Function to check whether two arrays
// can be made equal by reversing
// a sub-array only once
static void checkArray(int []A, int []B, int N)
{
// Integer variable for
// storing the required
// starting and ending
// indices in the array
int start = 0;
int end = N - 1;
// Finding the smallest index
// for which A[i] != B[i]
// i.e the starting index
// of the unequal sub-array
for(int i = 0; i < N; i++)
{
if (A[i] != B[i])
{
start = i;
break;
}
}
// Finding the largest index
// for which A[i] != B[i]
// i.e the ending index
// of the unequal sub-array
for(int i = N - 1; i >= 0; i--)
{
if (A[i] != B[i])
{
end = i;
break;
}
}
// Reversing the sub-array
// A[start], A[start+1] .. A[end]
Array.Reverse(A, start, end);
// Checking whether on reversing
// the sub-array A[start]...A[end]
// makes the arrays equal
for(int i = 0; i < N; i++)
{
if (A[i] != B[i])
{
// If any element of the
// two arrays is unequal
// print No and return
Console.Write("Yes");
return;
}
}
// Print Yes if arrays are
// equal after reversing
// the sub-array
Console.Write("Yes");
}
// Driver code
public static void Main(string[] args)
{
int []A = { 1, 3, 2, 4 };
int []B = { 1, 2, 3, 4 };
int N = A.Length;
checkArray(A, B, N);
}
}
// This code is contributed by rutvik_56
输出:
Yes
时间复杂度: O(N)