题目
题目连接:https://leetcode-cn.com/problems/check-if-a-string-can-break-another-string/
题目解析:给两个字母集合,找出使得两个字母集合按照顺序都有一个集合的字母始终比另一个字母大的顺序。就比如{a,b,c}<{a,x,y},因为a跟a一样大,x比b大,y比c大,所以可以打破
题目方法:
- 第一种是我的方法,直接暴力解法,实在是慢的不行
- 将两个字符串按照字母排序
- 然后两个字符串一一比对
- 如果中间的一对字母比较跟前两个不一样,就说明不能打破
- 跟我上面的思路差不多,但是我感觉我脑子有点问题,数组可以排序,我为啥要用集合
- 一样先将字符串转换成数组进行排序
- 然后先让第一个减后一个,按照顺序一组组进行,其中有一组小于0则跳出循环
- 如果全部运行完就返回true;
- 如果没有运行完,则进行下一个循环,让后一个减前一个,按照顺序一组组进行,其中有一组小于0则跳出循环
- 如果全部运行完就返回true
- 如果没有则返回false;
代码
- 第一种方法:
class Solution {
public boolean checkIfCanBreak(String s1, String s2) {
//创建集合用来存放字符串中的字母
List<Character> a1 = new ArrayList<Character>();
List<Character> b1 = new ArrayList<Character>();
//用存放大小
int sum1 = 0;
int sum2 = 0;
//用于判断哪个字符串比较大
int flag = 1;
//循环遍历,将字符串中的字母放入集合,并且计算出字符串的大小
for(int i=0;i<s1.length();i++){
a1.add(s1.charAt(i));
sum1 = sum1 + s1.charAt(i);
b1.add(s2.charAt(i));
sum2 = sum2 + s2.charAt(i);
}
//进行排序
Collections.sort(a1);
Collections.sort(b1);
//判断大小
if(sum1>sum2)
flag = 0;
else if(sum1 == sum2)
flag = 2;
//按照大小进行遍历判断,如果有一对判断跟之前的不一样就返回false;
for(int i=0;i<s1.length();i++){
char a2 = a1.get(i);
char b2 = b1.get(i);
if(flag == 0) {
if(a2<b2)
return false;
}else if(flag == 1) {
if(a2>b2)
return false;
}else if(flag == 2) {
if(a2!=b2)
return false;
}
}
//全部遍历完,说明都是单调递增或者递减,所以返回true
return true;
}
}
- 第二种方法:
class Solution {
public boolean checkIfCanBreak(String s1, String s2) {
//转换成字符数组
char[] a = s1.toCharArray();
char[] b = s2.toCharArray();
//排序
Arrays.sort(a);
Arrays.sort(b);
//进行计数
int count = 0;
//循环遍历,如果有一组小于0则退出
while(count < s1.length() && a[count]-b[count]>=0) {
count++;
}
//如果所有组都是单调递增的,则返回true
if(count==s1.length()) {
return true;
}
//清零重新计数
count = 0;
//循环遍历,如果有一组小于0则退出
while(count < s2.length() && b[count] - a[count]>=0) {
count++;
}
//如果所有组都是单调递增的,则返回true
if(count==s2.length())
return true;
//如果两次都没有则返回false;
return false;
}
}