惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
V
Visual Studio Blog
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
B
Blog
I
InfoQ
博客园 - 三生石上(FineUI控件)
阮一峰的网络日志
阮一峰的网络日志
F
Fortinet All Blogs
H
Help Net Security
博客园 - Franky
宝玉的分享
宝玉的分享
博客园 - 司徒正美
C
Check Point Blog
G
Google Developers Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
A
About on SuperTechFans
罗磊的独立博客
大猫的无限游戏
大猫的无限游戏
IT之家
IT之家

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant
Palindrome Partitioning | Backtracking
Jaspreet singh · 2026-06-17 · via DEV Community

Jaspreet singh

Problem Statement

Given a string s, partition it such that every substring of the partition is a palindrome.

Return all possible palindrome partitionings.


Brute Force Intuition

We can generate every possible partition of the string and then check whether every substring in that partition is a palindrome.

For a string of length N, the number of possible partitions grows exponentially, making brute force expensive.

Complexity

  • Time Complexity: O(2ᴺ × N)
  • Space Complexity: O(N)

Moving Towards the Optimal Approach

Instead of generating all partitions first and validating later, we can validate while building the partition.

At every index:

Try all possible substrings

If a substring is a palindrome:

Choose it
Recurse on remaining string
Backtrack

This avoids exploring many invalid paths.


Pattern Recognition

Whenever you see:

  • Generate all valid partitions
  • String partitioning
  • Constraints on each partition

Think:

Backtracking + Validation


Key Observation

For:

s = "aab"

At index 0, possible cuts are:

"a"   ✅
"aa"  ✅
"aab" ❌

Only palindrome substrings should be considered.


Recursive Decision Tree

"aab"

                []
              /    \
            "a"    "aa"
             |       |
           ["a"]  ["aa"]
             |       |
            "a"      "b"
             |       |
        ["a","a"] ["aa","b"]
             |
            "b"
             |
      ["a","a","b"]

Valid answers:

["a","a","b"]
["aa","b"]


Optimal Java Solution

import java.util.*;

class Solution {

    public List<List<String>> partition(String s) {

        List<List<String>> ans = new ArrayList<>();

        helper(0, s, new ArrayList<>(), ans);

        return ans;
    }

    private void helper(int index,
                        String s,
                        List<String> temp,
                        List<List<String>> ans) {

        if (index == s.length()) {
            ans.add(new ArrayList<>(temp));
            return;
        }

        for (int end = index; end < s.length(); end++) {

            if (isPalindrome(index, end, s)) {

                temp.add(s.substring(index, end + 1));

                helper(end + 1, s, temp, ans);

                temp.remove(temp.size() - 1);
            }
        }
    }

    private boolean isPalindrome(int i, int j, String s) {

        while (i < j) {

            if (s.charAt(i) != s.charAt(j))
                return false;

            i++;
            j--;
        }

        return true;
    }
}


Dry Run

Input

s = "aab"

Step 1

Choose "a"

Current Partition:

["a"]

Remaining:

"ab"


Step 2

Choose "a"

Current Partition:

["a","a"]

Remaining:

"b"


Step 3

Choose "b"

Current Partition:

["a","a","b"]

Valid Answer


Another Path

Start with:

"aa"

Current Partition:

["aa"]

Then:

["aa","b"]

Valid Answer


Output

[
    ["a","a","b"],
    ["aa","b"]
]


Why Backtracking Works?

At every position we try every possible cut:

index → end

If the chosen substring is a palindrome:

Take it
Explore further
Undo choice

This guarantees all valid partitions are generated exactly once.


Complexity Analysis

Metric Complexity
Time Complexity O(N × 2ᴺ)
Space Complexity O(N)

The recursion generates exponentially many partitions in the worst case.


Interview One-Liner

At every index, try all possible substrings. If a substring is a palindrome, include it in the current partition and recursively solve for the remaining string.


Pattern Learned

Generate All Valid Partitions
+
Validate Each Choice
+
Backtrack

=> Backtracking

Similar Problems

  • Palindrome Partitioning
  • Restore IP Addresses
  • Word Break II
  • N Queens
  • Combination Sum
  • Subsets

Memory Trick

Palindrome Partitioning is not a Pick / Not Pick problem.

Think:

Start Index
    ↓
Try Every Possible Cut
    ↓
Palindrome?
    ↓
Yes → Take
No  → Skip

Mental Model

Subsets
→ Pick / Not Pick

Combination Sum
→ Pick / Not Pick

Palindrome Partitioning
→ Try Every Cut
→ Validate Cut
→ Recurse

Once you recognize "Generate all valid partitions", your brain should immediately think:

Backtracking + Try Every Cut + Palindrome Check