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

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

分割链表



题目描述:


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


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


示例:


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

输出: 1->2->2->4->3->5


分析:

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


20201219152510823.png


实现代码为:


/**
 * 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。


扰乱字符串



20201219152720510.png


分析:


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


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


20201219152804912.png


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


20201219153032923.png


具体实现代码上,我使用递归的方式,通过字符串转成字符数组优化一点速度。


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;     
    }
}


202012191533546.png


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


结语



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


  1. star支持一下, 您的肯定是我在平台创作的源源动力。
  2. 微信搜索「bigsai」,关注我的公众号,不仅免费送你电子书,我还会第一时间在公众号分享知识技术。加我还可拉你进力扣打卡群一起打卡LeetCode。


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


目录
相关文章
|
23小时前
|
索引
每日一题:力扣328. 奇偶链表
每日一题:力扣328. 奇偶链表
13 4
|
23小时前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
23小时前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
11 0
|
23小时前
leetcode代码记录(移除链表元素
leetcode代码记录(移除链表元素
10 0
|
23小时前
【每日一题】LeetCode——反转链表
【每日一题】LeetCode——反转链表
|
23小时前
【每日一题】LeetCode——链表的中间结点
【每日一题】LeetCode——链表的中间结点
|
23小时前
|
C++
[leetcode 链表] 反转链表 vs 链表相交
[leetcode 链表] 反转链表 vs 链表相交
|
23小时前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
23小时前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)