原题链接:#242 Valid Anagram
要求:
给定两个字符串s和t,写一个函数,判断t是否是s的变位词。
如果t跟s包含相同字符但排列顺序不同,则称t是s的变位词。
例如:
s = "anagram", t ="nagaram",返回true
s = "rat", t = "car",返回false
注意:可以假定字符串只包含小写字母。
难度:容易
分析:
解这个问题有两种思路,由于题目限定字符串中只包含小写字母,那么分别计算两个字符串中每个字母出现次数,然后再比较即可。第二种思路是把字符串看作字符数组,将两个字符数组分别排序,所得结果若相同,则说明两个字符串互为变位词。
解决方案:
Java - 342ms
public boolean isAnagram(String s, String t) { if(s==null||t==null||s.length()!=t.length()){ return false; } char[] array1 = s.toCharArray(); char[] array2 = t.toCharArray(); Arrays.sort(array1); Arrays.sort(array2); return Arrays.equals(array1, array2); }
上述解决方案中直接使用了Arrays.sort()方法来为两个数组排序,当然,也可以自己实现排序算法。最常用的冒泡和快排:
冒泡排序:
public void bubbleSort(char[] array) { for(int i=0; i<array.length-1; i++){ for(int j=0; j<array.length-i-1; j++){ if(array[j]>array[j+1]){ char temp = array[j]; array[j] = array[j+1]; array[j+1] = temp; } }yi } }
快速排序:
public void quickSort(char[] array, int low, int high) { if(low>=high){ return; } char paviot = array[low]; int l = low+1, h = high; while(l<h){ while(array[h]>=paviot && l<h){ h--; } while(array[l]<=paviot && l<h){ l++; } if(l<h){ char tmp = array[l]; array[l] = array[h]; array[h] = tmp; } } if(array[low]>array[l]){ array[low] = array[l]; array[l] = paviot; } quickSort(array, low, l-1); quickSort(array, l+1, high); }
冒泡排序时间复杂度为O(n2),快排为O(nlogn)。八大排序算法一文对各排序算法有比较好的总结,在此不再赘述。事实上,查看Arrays.sort()的实现可知,它所使用的是一个改进的双paviot的快速排序算法。可参见java.util.DualPivotQuicksort。
相关推荐
python python_leetcode题解之242_Valid_Anagram.py
然后通过用循环来解:假设第一个for循环是一个数组的循环,而后它的内嵌循环是也是这个数组,只是下标从0变成了1,这样,在第一次循环时,第1个元素会与其他所有元素
面试题 02.06. 回文链表标签:栈、递归、链表、双指针难度:简单题目大意给定一个链表的头节点 head。然后再使用两个指针,一个指向数组开始位置,一个指向数
0148. 排序链表标签:链表、双指针、分治、排序、归并排序难度:中等题目大意给定链表的头节点 head。将排序后的子链表进行归并排序,得到完整的排序后的链表。
解题思路如果 n ,则 n 必然不是丑数,直接返回 False。对 n 分别进行 2、3、5 的整除操作,直到 n 被除完,如果 n 最终为 1,则 n
旋转操作指的是:升序排列的数组 nums 在预先未知的第 k 个位置进行了右移操作,变成了 [nums[k]], nums[k+1], ... , nums[n
解题思路序列化:通过深度优先搜索的方式,递归遍历节点,以 root.val、len(root.children)、root.children 的顺序生成序列化结
0259. 较小的三数之和标签:数组、双指针、二分查找、排序难度:中等题目大意给定一个长度为 n 的整数数组和一个目标值 target。这种思路使用了两重循环,
解法一:先通过哈希表统计S串中不同种石头的个数,然后遍历J串统计石头的个数int numJewelsInStones(string J, string S) {
冒泡排序(Bubble Sort)1,列表每两个相邻的数,如果前面比后面大,则交换这两个数。时间复杂度为O(n的平方)冒泡排序优化如果冒泡排序中的一趟排序没有发
解法一:先统计奇数所在的下标,再通过滑动窗口的方式计算目标数组数量int numberOfSubarrays(vector<int>& nums, int k)
① 对于给定的n个权值{W,w2,.. wn}, 构造出具有n棵叉树的森林F={ T, T,, .... T},其中每棵.1叉树T均只有一个带有权值w的根结点
《LeetCode---C++实现》是一本专注于C++编程语言解决LeetCode在线判题平台上的算法问题的书籍。LeetCode是程序员广泛使用的平台,它提供了大量的编程题目来提升编程技能和算法理解,尤其对于准备面试的程序员来说,...
解题思路思路和LeetCode-python 503.下一个更大元素 II一致,只是这里求的是下标的距离,而不是数值倒序搜索,用到栈,栈里存储索引情况1:若栈为
按奇偶排序数组II一、LeetCode题解瞧一瞧~博健的LeetCode题解:Gitbook版本传送门博健的LeetCode题解:CSDN传送门有趣的CSS:G
剑指 Offer 15. 二进制中1的个数方法一:位运算* @param {number} n - a positive integervar hammingW
1.AMD(require.js),require 的第一个参数表示依赖的模块的路径,第二个参数表示此模块的内容 1.CMD 推崇依赖就近,AMD 推崇依赖前置
1.1常数级链表排序Sort a linked list in O(n log n) time using constant space complexity.
leetcode leetcode-cli-plugins leetcode-cli 的第 3 方插件。 什么是 如何使用 如何使用 插件 名称 描述 增强的命令 按公司或标签过滤问题 list 不要在同一台计算机上使 Chrome 的会话过期 login 不要在同一台...
0881. 救生艇标签:贪心、数组、双指针、排序难度:中等题目大意给定一个整数数组 people 代表每个人的体重,其中第 i 个人的体重为 people[i]