给定两个字符串S1和S2 ,任务是检查S2 是否包含S1的字谜作为其子字符串。
例子:
Input: S1 = “ab”, S2 = “bbpobac”
Output: Yes
Explanation: String S2 contains anagram “ba” of S1 (“ba”).
Input: S1 = “ab”, S2 = “cbddaoo”
Output: No
处理方法:按照以下步骤解决问题:
- 初始化两个Hashmap s1hash和s2hash ,用于存储两个字符串的字母出现频率。
- 如果S1的长度大于S2的长度,则打印“NO” 。
- 迭代字符串S1的字符并更新s1hash 。
- 使用滑动窗口技术迭代字符串S2的字符并相应地更新 HashMap。
- 对于长度等于 S1 长度的 S2 的任何子字符串,如果发现两个 Hashmaps 相等,则打印“YES” 。
- 否则,打印“NO” 。
下面是上述方法的实现:
C++
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to check if string s2
// contains anagram of the string
// s1 as its substring
bool checkAnagram(string s1, string s2)
{
// Stores frequencies of
// characters in substrings of s2
vector s2hash(26, 0);
// Stores frequencies of
// characters in s1
vector s1hash(26, 0);
int s1len = s1.size();
int s2len = s2.size();
// If length of s2 exceeds length of s1
if (s1len > s2len)
return false;
int left = 0, right = 0;
// Store frequencies of characters in first
// substring of length s1len in string s2
while (right < s1len) {
s1hash[s1[right] - 'a'] += 1;
s2hash[s2[right] - 'a'] += 1;
right++;
}
right -= 1;
// Perform Sliding Window technique
while (right < s2len) {
// If hashmaps are found to be
// identical for any substring
if (s1hash == s2hash)
return true;
right++;
if (right != s2len)
s2hash[s2[right] - 'a'] += 1;
s2hash[s2[left] - 'a'] -= 1;
left++;
}
return false;
}
// Driver Code
int main()
{
string s1 = "ab";
string s2 = "bbpobac";
if (checkAnagram(s1, s2))
cout << "YES\n";
else
cout << "No\n";
return 0;
}
Java
// Java program for the above approach
import java.io.*;
import java.util.*;
class GFG
{
// Function to check if string s2
// contains anagram of the string
// s1 as its substring
public static boolean checkAnagram(String s1, String s2)
{
// Stores frequencies of
// characters in substrings of s2
int s2hash[] = new int[26];
// Stores frequencies of
// characters in s1
int s1hash[] = new int[26];
int s1len = s1.length();
int s2len = s2.length();
// If length of s2 exceeds length of s1
if (s1len > s2len)
return false;
int left = 0, right = 0;
// Store frequencies of characters in first
// substring of length s1len in string s2
while (right < s1len)
{
s1hash[s1.charAt(right) - 'a'] += 1;
s2hash[s2.charAt(right) - 'a'] += 1;
right++;
}
right -= 1;
// Perform Sliding Window technique
while (right < s2len) {
// If hashmaps are found to be
// identical for any substring
if (Arrays.equals(s1hash, s2hash))
return true;
right++;
if (right != s2len)
s2hash[s2.charAt(right) - 'a'] += 1;
s2hash[s2.charAt(left) - 'a'] -= 1;
left++;
}
return false;
}
// Driver Code
public static void main(String[] args)
{
String s1 = "ab";
String s2 = "bbpobac";
if (checkAnagram(s1, s2))
System.out.println("YES");
else
System.out.println("No");
}
}
// This code is contributed by kingash.
Python3
# Python 3 Program to implement
# the above approach
# Function to check if string s2
# contains anagram of the string
# s1 as its substring
def checkAnagram(s1, s2):
# Stores frequencies of
# characters in substrings of s2
s2hash = [0 for i in range(26)]
# Stores frequencies of
# characters in s1
s1hash = [0 for i in range(26)]
s1len = len(s1)
s2len = len(s2)
# If length of s2 exceeds length of s1
if (s1len > s2len):
return False
left = 0
right = 0
# Store frequencies of characters in first
# substring of length s1len in string s2
while (right < s1len):
s1hash[ord(s1[right]) - 97] += 1
s2hash[ord(s2[right]) - 97] += 1
right += 1
right -= 1
# Perform Sliding Window technique
while (right < s2len):
# If hashmaps are found to be
# identical for any substring
if (s1hash == s2hash):
return True
right += 1
if (right != s2len):
s2hash[ord(s2[right]) - 97] += 1
s2hash[ord(s2[left]) - 97] -= 1
left += 1
return False
# Driver Code
if __name__ == '__main__':
s1 = "ab"
s2 = "bbpobac"
if (checkAnagram(s1, s2)):
print("YES")
else:
print("No")
# This code is contributed by ipg2016107
C#
// C# Program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to check if string s2
// contains anagram of the string
// s1 as its substring
static bool checkAnagram(string s1, string s2)
{
// Stores frequencies of
// characters in substrings of s2
List s2hash = new List();
for(int i=0;i<26;i++)
s2hash.Add(0);
// Stores frequencies of
// characters in s1
List s1hash = new List();
for(int i=0;i<26;i++)
s1hash.Add(0);
int s1len = s1.Length;
int s2len = s2.Length;
// If length of s2 exceeds length of s1
if (s1len > s2len)
return false;
int left = 0, right = 0;
// Store frequencies of characters in first
// substring of length s1len in string s2
while (right < s1len) {
s1hash[s1[right] - 'a'] += 1;
s2hash[s2[right] - 'a'] += 1;
right++;
}
right -= 1;
// Perform Sliding Window technique
while (right < s2len) {
// If hashmaps are found to be
// identical for any substring
if (s1hash == s2hash)
return true;
right++;
if(right != s2len)
s2hash[s2[right] - 'a'] += 1;
s2hash[s2[left] - 'a'] -= 1;
left++;
}
return false;
}
// Driver Code
public static void Main()
{
string s1 = "ab";
string s2 = "bbpobac";
if (checkAnagram(s1, s2)==true)
Console.WriteLine("NO");
else
Console.WriteLine("YES");
}
}
// This code is contributed by bgangawar59.
Javascript
输出:
YES
时间复杂度: O(26 * len(S2))
辅助空间: O(26)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。