判断两个字符串是否互为变形词

博客给出判断两个字符串是否互为变形词的问题,即两字符串出现字符种类相同且每种字符出现次数也相同则互为变形词。还给出了示例,如“123”和“231”返回true,“123”和“2331”返回false。

题目描述:

给定两个字符串str1和str2,如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样,那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。

举例:

str1=“123” ,str2=“231”,返回true

str1=“123” ,str2=“2331”,返回false

 

代码如下:

 1 public class Solution {
 2     public boolean isDeformation(String s1,String s2) {
 3         if (s1==null||s2==null||s1.length()!=s2.length()) {
 4             return false;
 5         }
 6         char[] ch1=s1.toCharArray();
 7         char[] ch2=s2.toCharArray();
 8         int[] num=new int[256];
 9         for (int i=0; i<ch1.length; i++) {
10             num[ch1[i]]++;
11         }
12         for (int i=0; i<ch2.length; i++) {
13             num[ch2[i]]--;
14             if (num[ch2[i]]<0) {
15                 return false;
16             }
17         }
18         return true;
19     }
20     public static void main(String[] args) {
21         Solution s=new Solution();
22         boolean re=s.isDeformation("123","2331");
23         System.out.println(re);
24     }
25 }

欢迎评论,共同进步!!

 

转载于:https://www.cnblogs.com/hengzhezou/p/11059968.html

<think>好的,我现在需要解决用户的问题:如何用Python判断两个字符串是否互为变位。根据用户提供的引用和之前的问题,我需要先理解什么是变位,然后看看不同的实现方法。首先,变位的定义是两个字符串中的字符通过重新排列组合而成,例如“listen”和“silent”。根据引用中的内容,用户已经提到几种方法,比如排序法、使用集合(但这种方法有问题)以及检查长度等。用户给出的引用[1]和[2]提到,可以通过将字符串排序后比较是否相等来判断。例如,将两个字符串都转换为小写,去除空格,然后排序后的结果如果相同,则是变位。引用[3]中提到使用集合的方法,但这种方法有问题,因为集合无法统计字符出现的次数,比如“aab”和“abb”的集合是相同的,但字符出现次数不同,所以这种方法不可靠。引用[4]则错误地只检查长度是否相等,显然不完整。所以,正确的做法应该是首先检查两个字符串长度是否相同,如果不同直接返回“no”。然后对字符进行统计,比如使用字典或者计数器来比较每个字符出现的次数是否相同。或者更简单的方法是将字符串排序后比较是否相等。现在,我需要考虑用户可能的输入情况,比如是否区分大小写、是否包含空格等。根据引用[3],用户提到去除空格并转换为小写,所以应该处理这些情况。接下来,我需要编写Python代码来实现这个逻辑。可能的步骤如下:1.去除输入字符串中的空格,并统一转换为小写。2.检查处理后的两个字符串长度是否相同,如果不同,返回False。3.对两个字符串进行排序,比较排序后的结果是否相同。这样就能正确判断是否为变位了。而使用集合的方法不可行,因为无法统计字符频率,比如例子中的“aab”和“abb”会有相同的集合但不同的频率。另外,用户提到的引用[4]中的C++代码只检查长度,显然不完整,所以需要避免这种错误方法。总结,正确的方法应该是:处理输入(去空格、转小写),检查长度,排序比较。这样就能覆盖所有情况,正确判断是否为变位。</think>### 分步解决方案与示例代码 #### 问题分析 变位需满足以下两个条件: 1. 字符串长度相等 2. 各字符出现频率完全相同(不考虑顺序) #### 关键步骤 1. **预处理**:去除空格并统一大小写 2. **快速验证**:检查预处理后字符串长度 3. **核心判断**:使用排序法或字符计数器比较 #### 实现方法一:排序法(时间复杂度$O(n\log n)$) ```python def is_anagram(s1: str, s2: str) -> bool: # 预处理:去空格、转小写 s1 = s1.replace(' ', '').lower() s2 = s2.replace(' ', '').lower() # 快速验证长度 if len(s1) != len(s2): return False # 排序比较 return sorted(s1) == sorted(s2) # 测试样例 print(is_anagram("listen", "silent")) # True print(is_anagram("python", "typhon")) # True print(is_anagram("aab", "abb")) # False ``` #### 实现方法二:字符计数器(时间复杂度$O(n)$) ```python from collections import defaultdict def is_anagram_counter(s1: str, s2: str) -> bool: s1 = s1.replace(' ', '').lower() s2 = s2.replace(' ', '').lower() if len(s1) != len(s2): return False counter = defaultdict(int) for c in s1: counter[c] += 1 for c in s2: counter[c] -= 1 if counter[c] < 0: return False return True # 测试样例 print(is_anagram_counter("heart", "earth")) # True print(is_anagram_counter("Apple", "Papel")) # True print(is_anagram_counter("test", "taste")) # False ``` #### 方法对比 | 方法 | 时间复杂度 | 空间复杂度 | 适用场景 | |--------------|------------|------------|--------------------| | 排序法 | $O(n\log n)$ | $O(n)$ | 简单场景 | | 字符计数器法 | $O(n)$ | $O(k)$[^1] | 大字符串或高频调用 | #### 数学验证 设字符串$s_1$和$s_2$的字符频率函数为$f_1(c)$和$f_2(c)$,则变位成立当且仅当: $$ \forall c \in \Sigma,\ f_1(c) = f_2(c) $$ 其中$\Sigma$为字母表集合[^2] #### 常见错误 1. **未处理大小写**:如`"Apple"`与`"papel"`应返回True 2. **忽略空格**:如`"astronomer"`与`"moon starer"`是变位 3. **错误使用集合**:集合无法检测字符重复次数(如`"aab"`与`"abb"`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值