def backtrack(self, s, cur_lvl, ret):
        if not s:
            ret.append(list(cur_lvl))

        for i in xrange(1, len(s)+1):
            if self.predicate(s[:i]):
                cur_lvl.append(s[:i])
                self.backtrack(s[i:], cur_lvl, ret)
                cur_lvl.pop()
Return the data for this job - this is where the expensive work should
dataset/ETHPy150Open algorhythms/LintCode/Palindrome Partitioning.py/Solution.backtrack--crossover with--dataset/ETHPy150Open codeinthehole/django-cacheback/cacheback/base.py/Job.fetch