LeetCode 86分割链表&87扰乱字符串

微信搜一搜bigsai 专注于Java、数据结构与算法,一起进大厂不迷路!
算法文章题解全部收录在github仓库bigsai-algorithm,求star!
关注回复进群即可加入力扣打卡群,欢迎划水。近期打卡:
LeetCode 73矩阵置零&74搜素二维矩阵&75颜色分类
Leetcode 76最小覆盖子串&77组合&78子集
LeetCode 79单词搜索&80删除排序数组中的重复项Ⅱ&81.搜索旋转排序数组Ⅱ
如有帮助,记得一键三连

分割链表

题目描述:

给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。

你应当保留两个分区中每个节点的初始相对位置。

示例:

输入: head = 1->4->3->2->5->2, x = 3
输出: 1->2->2->4->3->5

分析:
这题的话也很简单,它要求将小于x的节点放到前面,且相对位置不变。我们可以采用两个链表将其分割开来然后再合并,在具体的处理上,可以创建两个带头节点的链表,遍历这个链表,其中一个收集比x小的节点,另一个收集比x大的节点,最后组合一下即可。

在这里插入图片描述

实现代码为:

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode partition(ListNode head, int x) {
        ListNode smallhead=new ListNode(0);//头节点 0不使用
    	ListNode smallteam=smallhead;//进行遍历
    	ListNode bighead=new ListNode(0);//头
    	ListNode bigteam=bighead;//遍历使用
    	while (head!=null) {
			if(head.val<x)
			{
				smallteam.next=head;
				smallteam=smallteam.next;
			}
			else {
				bigteam.next=head;
				bigteam=bigteam.next;
			}
			head=head.next;
		}
    	smallteam.next=bighead.next;//拼接
        bigteam.next=null;//置空
    	return smallhead.next;
    }
}

时间的话都是0ms。

扰乱字符串

在这里插入图片描述

分析:
题意很清晰,就问你s1能不能转换成s2。本题可以采用递归和动态规划的方式,两者一个是从前往后,一个是从后往前进行递推。

判断是否能够经过递归交换转换而来,首先两个字符串s1和s2需要等长,然后其中的元素种类和个数也需要完全相同才行。(具体实现上可以借助hashmap或者数组进行计数统计)。

在这里插入图片描述

相同之后可能有很多种划分需要一一的进行比较,可以递归向下进行(要有递归信任),分的两个组合情况有一个可以交换即可认为是true的。

在这里插入图片描述
具体实现代码上,我使用递归的方式,通过字符串转成字符数组优化一点速度。

class Solution {
    public boolean isScramble(String s1, String s2) {
        if(s1.equals(s2))return true;
		 if(s1.length()!=s2.length())return false;
		 char ch1[]=s1.toCharArray();
		 char ch2[]=s2.toCharArray();
		 int count[]=new int[26];
		
		 for(int i=0;i<ch2.length;i++)
		 {
			 count[ch1[i]-'a']++;
			 count[ch2[i]-'a']--;
		 }
		 for(int  i=0;i<26;i++)
		 {
			 if(count[i]!=0)//计数看看单词是否等
			 {
				 return false;
			 }
		 }
		 for(int i=1;i<ch1.length;i++)//进行划分,递归的匹配
		 {
		      if(isScramble(s1.substring(0,i), s2.substring(0, i))&&isScramble(s1.substring(i), s2.substring(i)))
		      {
		    	  return true;
		      }
		      if(isScramble(s1.substring(0,i), s2.substring(s2.length()-i))&&isScramble(s1.substring(i), s2.substring(0,s2.length()-i)))
		      {
		    	  return true;
		      }
		 }
		 return false;		 
    }
}

在这里插入图片描述

至于动态规划的解题方法,是一个从下往上的递推过程,实现上需要考虑下边界初始化和递推式,这里就不实现啦,有兴趣的可以参考官网。

结语

原创不易,bigsai请你帮两件事帮忙一下:

  1. star支持一下, 您的肯定是我在平台创作的源源动力。

  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。

记得关注、咱们下次再见!

image-20201114211553660

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员bigsai

喝杯咖啡压压惊!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值